2016-12-01 7 views
1

Also ich habe Datenbank, die Tabelle mit wenigen Parametern enthält, ist einer von denen "Typ" (TEXT). Im Füllung ComboBox mit diesem „Typ“ mit dieser Methode:JavaFX ComboBox arbeitet mit Verzögerung

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); 
} 

dann verwende ich dieses ComboBox alle Elemente des ausgewählten Typs in Tableview zu zeigen.

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()); 
     } 
    }); 
} 

und hier ist loadTypeDataFromDB Methode, die

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); 
} 

es fast richtig funktioniert Abfrage mit ausgewählten Parameter ausführt. Ich starte meine App, wähle einen der Typen aus der ComboBox und nichts passiert (TableView bleibt frei). Dann wähle ich einen anderen Typ aus dieser ComboBox und plötzlich werden in TableView Objekte dieses Typs angezeigt und von nun an kann ich alle Typen anzeigen, die ich will, alles funktioniert. So sieht es aus wie die erste Wahl von ComboBox ist null (ich bekomme keine Ausnahmen tho). Nach dem ersten Wahl beginnt alles richtig zu arbeiten ...

+0

Wenn Sie, debuggen ist die 'changed' Methode auf erste Update aufgerufen ? IE: Erhalten Sie tatsächlich ein Änderungsereignis und die Lade-Methode funktioniert nicht oder ist das Problem, dass das Kombinationsfeld nichts meldet? – Ironcache

Antwort

1

Ihre Change Setup mir zweifelhaft scheint, und wahrscheinlich die Quelle Ihrer Probleme (obwohl, ich kann nicht sicher wissen, ohne mehr Code zu sehen):

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()); 
     } 
    }); 
} 

Wo nennen Sie diese Methode? Es benötigt ein ActionEvent als Eingabe. stellen Sie Ihren Hörer nicht auf nach Sie erhalten ein Ereignis? Denn das würde sicherlich erklären, warum Sie das erste nicht sehen.

Betrachten Sie den Hörer nach Zugabe der Produkte des Einrichtens (besser noch, wo Sie die ComboBox erstellen), und sehen, ob das hilft:

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

Nun, ich habe die Methode selectType von ComboBox onAction aufgerufen (in Scene Builder). Iv getan wie Sie vorgeschlagen, zog es in loadTypegromDB() und es funktioniert jetzt gut. Vielen Dank! – AGasior

+1

Sie können den 'onAction'-Aufruf von SB verwenden, um die' choiceType'-Methode aufzurufen, wenn Sie möchten, aber wenn Sie dies tun, ** nicht ** einen Change Listener in der 'choiceType'-Methode erstellen. Die 'onAction' Verknüpfung von SB ** ist ** Ihr Change Listener. Überprüfen Sie stattdessen in der Methode 'choiceType' den aktuellen Wert der Combobox und übergeben Sie diesen Wert an Ihre' load ... (String) 'Methode. – Ironcache

Verwandte Themen