CheckBoxTableCell 更改侦听器不起作用

Posted

技术标签:

【中文标题】CheckBoxTableCell 更改侦听器不起作用【英文标题】:CheckBoxTableCell changelistener not working 【发布时间】:2014-10-02 08:35:27 【问题描述】:

我正在尝试向我的 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 并且它有效,但由于功能要求,我宁愿在我目前正在工作的课程中进行。 javafx how to get selected row data in table view with checkbox 的可能重复项 【参考方案1】:

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 中看起来都好多了。

【讨论】:

这就是我想要的,再次感谢!你今天帮了我很多忙。需要稍微调整一下,但我会管理的。你今天给了我多少帮助,我感激不尽! 像魅力一样工作。谢谢! 非常感谢...伟大而简单的解决方案! 如果我在 Trainee 类中有一个 SimpleBooleanProperty 字段怎么办?可以分享一下代码吗?

以上是关于CheckBoxTableCell 更改侦听器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

值更改侦听器在 primefaces 日历中不起作用

JavaFX:当用户选中复选框时,CheckBoxTableCell 获取 ActionEvent

如何在飞镖中侦听对象中Map属性的更改

提交时的JavaScript addEventListener不起作用

如何更改 SWT 进度条的颜色?

表格单元格事件侦听器