CheckBoxTableCell changelistener不工作

Tae*_*rus 3 java javafx listener tableview tablecell

我正在尝试向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;
                    }
                });
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 12

selectedProperty是从继承Cell,它只是指示是否Cell在UI部件中选择.由于您可能没有启用单元格选择TableView,因此单元格永远不会被选中.这不是你想要的; 你想知道是否CheckBox被选中,而不是Cell.

这里的诀窍是使用的selectedStateCallback属性CheckBoxTableCell.这是一个将单元格的索引映射到a的函数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();
    }
});
Run Code Online (Sandbox Code Playgroud)

然后,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);
    }
});
Run Code Online (Sandbox Code Playgroud)

像往常一样,所有这些代码在Java 8中都看起来好多了.