当前位置: 首页 > 知识库问答 >
问题:

JavaFX ComboBox集合项目来自观察列表

陈功
2023-03-14

我需要帮助,以获得一个指定的项目列表,并将它们添加到组合框。

我的观察列表包含从数据库接收的值(在特定的只有3列的表中),我想在组合框中只显示一个列值。选择组合框时,其他值在2个文本字段中收费。

代码如下。

导入Accettazioni模型:

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

重要信息控制器:

@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个答案

施俊哲
2023-03-14

要获取JavaFX 属性的观察值,请使用< code>Property.get()或< code>Property.getValue()。按照惯例,Java开发人员覆盖< code>toString()方法,不向客户显示消息,而是供其他开发人员内部使用。

因此

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

应该是

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

更新:< br >由于您使用的是< code>ComboBox而不是< code>ChoiceBox,您还应该根据需要覆盖ComboBox的默认按钮单元格属性:

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

正如您所看到的,这是为细胞工厂设置的相同列表单元格。重构取决于您,或者当然您也可以实现具有不同内容的列表单元格。

 类似资料:
  • 问题内容: 我正在尝试在JavaFX 8中创建一个,需要一个。我不知道如何创建一个……但是,如果我尝试: 我收到一个错误消息,说它无法实例化,因为它是抽象的。可以理解的 如果我查看该文档,可以看到,但是我做不到: 因为没有适用的构造函数。显然我需要传递给,这很奇怪,因为我无法创建。 我不确定如何解密。如果我尝试 出于绝望,我得到了一个更加复杂的错误。 也不起作用。它以某种方式起作用(但显然使用了不

  • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可

  • 我有一个可以观察到的项目列表。我需要管道observable以便每个项目将执行api调用,用api调用的结果更新自己,并最终提供observable项目的更新列表。 我可以使用哪种运算符来执行此操作?

  • 我需要一个通过observatelist填充的组合框,其中包含从DB检索的特定数据。这是我的消息来源。 模型 查看 ComboBox由NAME字段填充,listener用于获取相对ID并将其传递给查询,以便在DB上存储数据。 好的,一切似乎都正常,但我有两个问题: > 当用户需要修改此记录时,我需要从DB获取ID并在ComboBox中选择相对名称。我该怎么做? comboBank.set值; 有没

  • 我有一个中心班,叫它。它可以添加1-N个观测值。我需要动态添加这些,然后知道最终的onComplete()何时执行。 怎么做? 代码示例: 使现代化 我已经研究这个有一段时间了。使用@DaveMoten的答案,我已经接近了。 下面是我的方法,可以随意添加一个新的observable,并在所有observable都完成时收到通知(伪代码): 日志记录看起来是这样的: 更新:我添加了一些计数器,这表明

  • 问题内容: 回答“ 我如何知道数组内元素的值是否已更改”这一问题时受到启发 ,答案是使用 属性观察 器检查数组是否已被修改。 但是,如何确定属性查看器中集合类型中的已更新元素是什么?例如: 请注意,每次添加,更新或删除操作都已调用该代码,但是我如何才能确切知道受影响的元素是什么?有没有办法通过将数组除以 Property Observer 来实现这一目标? 我问的是Swift中的所有集合类型,因为