java - CheckBoxTableCell 更改监听器不工作

标签 java javafx listener tableview tablecell

我正在尝试向我的 CheckBoxTableCells 添加一个更改监听器,但它似乎不起作用。我以 CheckBoxes 为例,认为它们的工作方式相同。但是,当我更改其值时没有输出。我如何将一个正确地添加到复选框表单元格中?

当前代码:

tc.setCellFactory(new Callback<TableColumn<Trainee, Boolean>, TableCell<Trainee, Boolean>>() {
                    @Override
                    public TableCell<Trainee, Boolean> call(TableColumn<Trainee, Boolean> p) {
                        final CheckBoxTableCell ctCell = new CheckBoxTableCell<>();
                        ctCell.selectedProperty().addListener(new ChangeListener<Boolean>() {
                            @Override
                            public void changed(ObservableValue ov, Boolean old_val, Boolean new_val) {
                                System.out.println(new_val);
                            }
                        });
                        return ctCell;
                    }
                });

最佳答案

selectedProperty 继承自Cell,它只是指示Cell 是否在UI 组件中被选中。由于您可能没有在 TableView 上启用单元格选择,因此该单元格永远不会被选中。无论如何,这不是您要找的东西;您想知道是否选择了 CheckBox,而不是 Cell

这里的技巧是使用 CheckBoxTableCellselectedStateCallback 属性。这是一个将单元格索引映射到 BooleanProperty 的函数。 BooleanProperty 双向绑定(bind)到复选框的选中状态。

如果您的专栏代表您的 Trainee 类中的实际属性(为了演示,我将其称为 selectedProperty)那么您可以这样做:

final CheckBoxTableCell<Trainee, Boolean> ctCell = new CheckBoxTableCell<>();
ctCell.setSelectedStateCallback(new Callback<Integer, ObservableValue<Boolean>>() {
    @Override
    public ObservableValue<Boolean> call(Integer index) {
        return table.getItems().get(index).selectedProperty();
    }
});

然后将 Trainee 类中的属性双向绑定(bind)到复选框状态。如果您需要做的不仅仅是在选中/取消选中复选框时更新模型对象,您可以只观察该属性。

如果您在Trainee 类中没有属性,您可以创建一个BooleanProperty 并观察它:

final CheckBoxTableCell<Trainee, Boolean> ctCell = new CheckBoxTableCell<>();
final BooleanProperty selected = new SimpleBooleanProperty();
ctCell.setSelectedStateCallback(new Callback<Integer, ObservableValue<Boolean>>() {
    @Override
    public ObservableValue<Boolean> call(Integer index) {
        return selected ;
    }
});
selected.addListener(new ChangeListener<Boolean>() {
    @Override
    public void changed(ObservableValue<? extends Boolean> obs, Boolean wasSelected, Boolean isSelected) {
        System.out.println(isSelected);
    }
});

像往常一样,所有这些代码在 Java 8 中看起来更漂亮。

关于java - CheckBoxTableCell 更改监听器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25210690/

相关文章:

java - 安全:090759 in weblogic managed logs

java - 使用gson库将Json反序列化为java类

java - nullpointerexception array = array.clone 不起作用?

java - 打开新阶段时参数类型不匹配异常

java - 安卓长触事件

java - Tess4J,找不到 tessdata

java - 如何在javafx中的tableview中显示多行单元格?

JavaFx:液体和固定网格 Pane 列宽

java - 在 Netbeans 中添加监听器

java - 是否可以扩展 Button 类并让它实现自己的 OnClick 监听器?