我需要帮助从 ObservableList 获取指定的项目列表并将它们添加到组合框。
我的 ObservableList 包含从数据库接收的值(特别是只有 3 列的表),我想在组合框中仅显示一列值。当选择组合框时,其他值将在 2 个文本字段中收取。
代码如下。
导入Acccettazioni模型:
public ObservableList<Impostazioni> listImpostazioni = FXCollections.observableArrayList();
public static class Impostazioni {
private final StringProperty rowid;
private final StringProperty nome;
private final StringProperty operatore;
private final StringProperty delimitatore;
private Impostazioni(String Rowid, String Nome, String Operatore, String Delimitatore) {
this.rowid = new SimpleStringProperty(Rowid);
this.nome = new SimpleStringProperty(Nome);
this.operatore = new SimpleStringProperty(Operatore);
this.delimitatore = new SimpleStringProperty(Delimitatore);
}
public StringProperty rowidProperty() { return rowid; }
public StringProperty nomeProperty() { return nome; }
public StringProperty operatoreProperty() { return operatore; }
public StringProperty delimitatoreProperty() { return delimitatore; }
}
导入AcccettazioniController:
@FXML
private ComboBox<ImportAccettazioniModel.Impostazioni> comboCaricaNome;
// get data from model to popupate combobox
public final void getImpostazioniDataFields() {
comboCaricaNome.getItems().clear();
comboCaricaNome.setItems(model.listImpostazioni);
comboCaricaNome.setCellFactory(new Callback<ListView<Impostazioni>, ListCell<Impostazioni>>() {
@Override public ListCell<Impostazioni> call(ListView<Impostazioni> p) {
return new ListCell<Impostazioni>() {
@Override
protected void updateItem(Impostazioni t, boolean bln) {
super.updateItem(t, bln);
if(t != null){
setText(t.nomeProperty().toString().toUpperCase());
System.out.println("SET PROPERTY " + t.nomeProperty().toString());
} else {
setText(null);
}
}
};
}
});
}
comboCaricaNome.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<ImportAccettazioniModel.Impostazioni>() {
@Override public void changed(ObservableValue<? extends ImportAccettazioniModel.Impostazioni> observable,ImportAccettazioniModel.Impostazioni oldValue, ImportAccettazioniModel.Impostazioni newValue) {
setTextFields(newValue);
}
});
//set data to textfield with the selected combo box
private void setTextFields(Impostazioni listImpostazioni) {
//setRowid(Impostazioni.rowidProperty().getValue());
if (comboCaricaNome.getItems().isEmpty()) {
editCaricaOperatore.setText("");
editCaricaDelimitatore.setText("");
} else {
editCaricaOperatore.setText(listImpostazioni.operatoreProperty().getValue());
editCaricaDelimitatore.setText(listImpostazioni.delimitatoreProperty().getValue());
}
}
现在,逻辑似乎有效,但我的组合框不包含值 nomeProperty()。
如何解决?
提前致谢
请您参考如下方法:
要获取 JavaFX Property
的观察值,请使用 Property.get()
或 Property.getValue()
。 按照惯例,Java 开发人员会重写 toString()
方法,以便不向客户显示消息,而是由其他开发人员在内部使用。
结果,该行
setText(t.nomeProperty().toString().toUpperCase());
应该是
setText(t.nomeProperty().getValue().toUpperCase());
更新:
由于您使用的是 ComboBox
而不是 ChoiceBox
,因此您还应该根据您的需要覆盖组合框的默认按钮单元格属性:
comboCaricaNome.setButtonCell(new ListCell<Impostazioni>() {
@Override
protected void updateItem(Impostazioni t, boolean bln) {
super.updateItem(t, bln);
if (t != null) {
setText(t.nomeProperty().getValue().toUpperCase());
} else {
setText(null);
}
}
});
如您所见,这与为 cellFactory 设置的 ListCell 相同。重构取决于您,当然您也可以实现具有不同内容的列表单元。