2016-12-01 121 views
1

因此,我有數據庫,其中包含幾個參數表,其中之一是「類型」(TEXT)。林填充的ComboBox這個「型」用這種方法:JavaFX ComboBox延遲工作

public void loadTypefromDB() 
{ 
    types = FXCollections.observableArrayList(); 
    try{ 
     ResultSet rs = conn.createStatement().executeQuery("SELECT type FROM Products"); 
     while(rs.next()){ 
      String product = rs.getString("type"); 
      types.add(product); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    choiceBox.setItems(types); 
} 

然後我用這個組合框來顯示TableView中所選類型的所有項目。

public void choiceType(ActionEvent event) 
{ 
    choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
      loadTypeDataFromDB(newValue.toString()); 
     } 
    }); 
} 

,這裏是loadTypeDataFromDB方法與選擇的參數

public void loadTypeDataFromDB(String type){ 
    products = FXCollections.observableArrayList(); 

    try { 
     PreparedStatement pst = conn.prepareStatement("SELECT name, kcal, protein, carb, fat FROM Products WHERE type=?"); 
     pst.setString(1, type); 
     ResultSet rs = pst.executeQuery(); 

     while(rs.next()){ 
      products.add(new productData(rs.getString("name"), rs.getString("kcal"), rs.getString("protein"), rs.getString("carb"), rs.getString("fat"))); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    colProduct.setCellValueFactory(new PropertyValueFactory<productData, String>("name")); 
    colKcal.setCellValueFactory(new PropertyValueFactory<productData, String>("kcal")); 
    colProtein.setCellValueFactory(new PropertyValueFactory<productData, String>("protein")); 
    colCarbs.setCellValueFactory(new PropertyValueFactory<productData, String>("carb")); 
    colFat.setCellValueFactory(new PropertyValueFactory<productData, String>("fat")); 

    tableProduct.setItems(null); 
    tableProduct.setItems(products); 
} 

它幾乎可以正確執行查詢。我運行我的應用程序,從ComboBox中選擇一種類型,沒有任何反應(TableView保持清晰)。然後我從這個ComboBox中選擇其他類型,突然它在TableView中顯示這種類型的項目,從現在開始,我可以顯示我想要的所有類型,一切正常。所以它看起來像ComboBox的第一選擇是空的(我沒有得到任何例外壽)。之後的第一選擇一切開始正常工作......

+0

如果調試,是呼籲第一次更新了'changed'方法? IE:你實際上是否收到一個更改事件,並且加載方法不起作用,或者組合框沒有報告什麼問題? – Ironcache

回答

1

你的ChangeListener設置似乎值得懷疑我,可能你的問題的來源(雖然,我不能確切知道沒有看到更多的代碼):

public void choiceType(ActionEvent event) 
{ 
    choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
      loadTypeDataFromDB(newValue.toString()); 
     } 
    }); 
} 

你在哪裏叫這個方法?它將一個ActionEvent作爲輸入;你是否在之後收到活動後才設置聽衆?因爲那肯定會解釋爲什麼你沒有看到第一個。

考慮加入後的產品建立監聽器(更好的是,在其中創建組合框),並看看是否有幫助:

public void loadTypefromDB() 
{ 
    types = FXCollections.observableArrayList(); 
    try{ 
     ResultSet rs = conn.createStatement().executeQuery("SELECT type FROM Products"); 
     while(rs.next()){ 
      String product = rs.getString("type"); 
      types.add(product); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    choiceBox.setItems(types); 
    choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
     @Override 
     public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
      loadTypeDataFromDB(newValue.toString()); 
     } 
    }); 
} 
+0

那麼,我正在通過ComboBox onAction(在Scene Builder中)調用choiceType方法。 Iv完成像你建議的,將它移入loadTypefromDB() 現在它工作正常。謝謝! – AGasior

+1

如果需要,您仍然可以使用SB的'onAction'調用來調用'choiceType'方法,但是如果這樣做,**不會在'choiceType'方法中創建一個更改偵聽器。從SB **鏈接的'onAction'是你的變化監聽器。相反,在'choiceType'方法中,檢查組合框的當前值,並將該值傳遞到'load ...(String)'方法中。 – Ironcache