Skip to main content
 首页 » 编程设计

combobox中JavaFX ComboBox 设置 ObservableList 中的项目

2024年11月24日64langtianya

我需要帮助从 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 相同。重构取决于您,当然您也可以实现具有不同内容的列表单元。