2016-12-01 7 views
1

これは、ほとんどのパラメータを持つテーブルを含むデータベースで、そのうちの1つは「タイプ」(TEXT)です。この方法では、この「タイプ」とイム充填コンボボックス:遅延で動作する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); 
} 

その後、私はテーブルビューで選択したタイプのすべての項目を表示するには、このコンボボックスを使用しています。

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から1つのタイプを選択し、何も起こらない(TableViewはクリアなままである)。次に、私はこのComboBoxから他のタイプを選択し、突然このタイプのアイテムをTableViewに表示します。今から、すべてのタイプを表示できます。すべてが機能します。だから、ComboBoxの最初の選択肢がnullであるように見えます(私は例外を何も得ません)。最初の選択肢のすべてが正常に動作を開始した後...

+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

まあ、私は(Scene Builderの)ComboBox onActionでchoiceTypeメソッドを呼び出していました。 Ivはuのようにして、loadTypefromDB() に移動し、今は正常に動作します。ありがとう! – AGasior

+1

SBの 'onAction'呼び出しを使って' choiceType'メソッドを呼び出すことはできますが、そうした場合は 'choiceType'メソッドで変更リスナーを作成しない**ことができます。 SB **からの 'onAction'リンクは**あなたの変更リスナーです。その代わりに、 'choiceType'メソッドの中で、コンボボックスの現在の値をチェックし、その値を' load ...(String) 'メソッドに渡します。 – Ironcache