首页 文章

JavaFX ComboBox从ObservableList设置项目

提问于
浏览
2

我需要帮助从ObservableList获取指定的项目列表,并将它们添加到组合框中 .

我的ObservableList包含从DB收到的值(在特定的表中只有3列),我想在组合框中只显示一个列值 . 选择组合框时,其他值将在2文本字段中收费 .

代码如下 .

ImportAccettazioniModel:

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

ImportAccettazioniController:

@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() .

我怎么解决?

提前致谢

1 回答

  • 2

    要获得JavaFX Property 的观察值,请使用 Property.get()Property.getValue() . 按照惯例,Java开发人员覆盖 toString() 方法以不向客户显示消息,而是由另一个开发人员用于内部使用 .

    结果,这条线

    setText(t.nomeProperty().toString().toUpperCase());
    

    应该

    setText(t.nomeProperty().getValue().toUpperCase());
    

    UPDATE:
    由于您使用的是 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 . 重构由您决定,当然您也可以实现具有不同内容的列表单元格 .

相关问题