【发布时间】:2016-06-14 03:04:04
【问题描述】:
所以我有一个包含 3 列的表格视图,其中一列是组合框列,我创建组合框列的方式就是这样
Source = new TableColumn<>("Configure Interface as..");
Source.setCellValueFactory(i -> {
final StringProperty value = i.getValue().optionProperty();
// binding to constant value
return Bindings.createObjectBinding(() -> value);
});
Source.setCellFactory(col -> {
TableCell<TableViewTest, StringProperty> c = new TableCell<>();
ComboBox<String> comboBox = new ComboBox<>(options);
c.itemProperty().addListener((observable, oldValue, newValue) -> {
if (oldValue != null) {
comboBox.valueProperty().unbindBidirectional(oldValue);
}
if (newValue != null) {
comboBox.valueProperty().bindBidirectional(newValue);
}
});
c.graphicProperty().bind(Bindings.when(c.emptyProperty()).then((Node) null).otherwise(comboBox));
return c;
});
该列从我的 TableViewTest 类中的 getter 方法 optionProperty() 获取其值。
所以我遇到的问题是我的 gui 中的 tableview 表上方还有另一个 combobox (comboBoxA),每当我更改 comboBoxA 的值时,我都想更改组合框的值与列。
我可以通过在监听组合框A的选择变化的方法中调用以下代码来做到这一点
Source.setCellValueFactory(i -> {
final StringProperty value = i.getValue().optionTwoProperty();
// binding to constant value
return Bindings.createObjectBinding(() -> value);
});
但除非开始向下滚动到表格底部附近,否则这些值不会改变。有没有办法强制组合框更改为 getter 方法 optionTwoProperty() 中的新值,而无需我向下滚动?
编辑
好吧,就这样吧
final StringProperty value = i.getValue().optionTwoProperty();
在我开始向下滚动之前实际上不会被调用。
【问题讨论】:
-
发布更改值的代码。由于您在这里使用了我的代码的修改版本stackoverflow.com/a/35134148/2991525,因此我使用
comboBoxA.valueProperty().addListener((a, b, c) -> { for (TableViewTest item : tableview.getItems()) { item.setOption(c); } });对此进行了测试,但无法重现错误。 -
问题是我使用的是 fxml 文件,而我的代码在 fxml 控制器文件中,所以我不必为 comboBoxA 设置监听器,只需命名我想调用的方法选择更改时。我用来更改值的代码是
Source.setcellValueFactory部分 -
您能出示您的声明以便我们了解事物的类型吗? (而且您的模型类也可能会有所帮助。)为什么您的单元格值是包装在绑定中的属性?你不能把它改成
TableColumn<Whatever, String>而不是TableColumn<Whatever, StringProperty>,它看起来就是这样吗? -
也许后退一步,解释一下你在这里真正想要做什么。是否在表格顶部有一个组合框可以更改所有值(类似于“设置所有”功能)?看起来你只是为了让某些东西发挥作用而把它弄得太复杂了。
-
所以我的工具将获取有关思科交换机上每个受监控会话的信息并将其显示给用户,但也允许用户使用该工具设置跨度会话。因此表格视图上方的组合框 (COMBOA) 将包含交换机上所有会话的列表,即会话一、会话二等。因此,如果我从 COMBOA 中选择会话一,那么 tableview 中的所有组合框都必须根据会话一的信息进行更改,即。端口一是输入,端口二是输出。
标签: java javafx combobox javafx-8