CheckBoxTableCell的changelistener不起作用。

3

我想给我的CheckBoxTableCells添加更改监听器,但好像并没有起作用。我使用了CheckBoxes的示例,认为它们应该以相同的方式工作。但是当我更改其值时没有任何输出。如何正确地将其添加到checkboxtablecell中?

当前代码:

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

我也制作了自己的CheckBoxTableCell并且它可以工作,但由于功能要求,我更愿意在我当前正在工作的类中完成它。 - Taerus
可能是以下问题的重复:javafx如何在带有复选框的表视图中获取所选行数据 - Mansueli
1个回答

13

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

关键在于使用CheckBoxTableCellselectedStateCallback属性。这是一种将单元格索引映射到BooleanProperty的函数。该BooleanProperty被双向绑定到复选框的选中状态。

如果您的列表示您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类中的属性将与复选框状态双向绑定。如果您需要在选择/取消选择复选框时执行更多操作而不仅仅是更新模型对象,则可以观察该属性。

如果在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的所有代码看起来都要漂亮得多。


这正是我在寻找的,再次感谢!你今天帮了我很多忙。需要稍微调整一下,但我会处理的。我无法感谢你今天为我所做的一切! - Taerus
就像魔法一样有效。谢谢! - Andreas
非常感谢您...这是一个伟大而简单的解决方案! - Chisey88
如果Trainee类中有一个SimpleBooleanProperty字段怎么办?你能分享一下它的代码吗? - Meet K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接