首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CheckBoxTableCell变送器不工作

CheckBoxTableCell变送器不工作
EN

Stack Overflow用户
提问于 2014-08-08 19:13:11
回答 1查看 6.9K关注 0票数 3

我试图在我的CheckBoxTableCells中添加一个更改监听器,但它似乎不起作用。我以CheckBoxes为例,认为它们的工作方式是相同的。但是,当我更改它的值时,没有输出。我如何正确地将一个添加到一个支票箱桌布?

当前代码:

代码语言:javascript
复制
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;
                    }
                });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-08 20:54:41

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

这里的诀窍是使用selectedStateCallback属性的CheckBoxTableCell。这是一个将单元格的索引映射到BooleanProperty的函数。该BooleanProperty双向绑定到复选框的选定状态。

如果您的列表示的是Trainee类中的实际属性(我将将其命名为selectedProperty以进行演示),那么您可以这样做:

代码语言:javascript
复制
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并观察它:

代码语言:javascript
复制
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中看起来都要好得多。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25210690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档