【问题标题】:Javafx Combo Box data populationJavafx 组合框数据填充
【发布时间】:2014-11-17 17:09:43
【问题描述】:

我想在组合框中填充一些数据。这工作正常。但是,我想动态更改组合框中的数据。

目前我有一个表格,在组合框中我显示表格列中数据的唯一值。现在表数据存储在静态可观察列表变量中。我想根据表中显示的数据更改组合框中的数据。也就是说,如果存储表数据的静态可观察列表发生变化,我想在没有人工干预的情况下更改组合框数据。

如果组合框也没有单独的静态变量,这是否可能?

【问题讨论】:

  • 请贴一些代码。目前还不清楚为什么任何东西都需要是静态的(这在 UI 代码中几乎总是一个坏主意)。

标签: java javafx javafx-2 javafx-8 fxml


【解决方案1】:

嗯,让我们看看,所以我们有你的 TableView 数据:

ObservableList<MyData> tableData = FXCollections.observableArrayList();

和您的 ComboBox 数据:

ObservableList<MyData> comboboxData = FXCollections.observableArrayList();

如果您想将两者链接在一起,最简单的方法是使用 FilteredList:

ObservableList<MyData> comboboxData = tableData.filtered(predicate);

因此,每当predicate 或tableData 更改时,这些更改将在comboboxData 中反映出来,无需任何进一步的操作。您现在只需要编写一个Predicate,它能够过滤表格数据,只留下您想要显示的组合框条目。


但是,如果您只想在 ComboBox 中显示 tableData 的不同值,那么使用简单的谓词就不会那么容易了。 这是一种非常丑陋的方法,使用 Listener 和 Set 来更新 ComboBox 列表:

ObservableList<String> tableData = FXCollections.observableArrayList();
ObservableList<String> comboBoxData = FXCollections.observableArrayList();

tableData.addListener((Observable change) -> {
    Set<String> distinct = new HashSet<>(tableData);
    comboBoxData.setAll(distinct);
});

当您的表包含大型数据集时,这很可能会导致性能问题,但对于较小的数据集,这应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 2012-09-11
    • 2019-06-11
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多