JavaFx如何使用cellFactory使复选框在tableColumnCell中可见

JavaFx如何使用cellFactory使复选框在tableColumnCell中可见,javafx,javafx-8,Javafx,Javafx 8,我想将复选框添加到tableCell,但我不知道在使用.setCellFactory时如何使复选框可见 我想通过cellFactory功能实现这一点---> 当我想使用cellFactory时,复选框不可见 ----> 这是BooleanColorCellFactory类 @Override public TableCell<Server, CheckBox> call(TableColumn<Server, CheckBox> param

我想将复选框添加到tableCell,但我不知道在使用.setCellFactory时如何使复选框可见

我想通过cellFactory功能实现这一点--->

当我想使用cellFactory时,复选框不可见 ---->

这是BooleanColorCellFactory类

        @Override
        public TableCell<Server, CheckBox> call(TableColumn<Server, CheckBox> param) {

            return new TableCell<Server, CheckBox>(){
                @Override
                protected void updateItem(CheckBox item, boolean empty) {
                    super.updateItem(item, empty);
//                  if(!empty) {
//                      setVisible(true);
//                      setEditable(true);
//                      getChildren().add(item);
//                  setText(item.toString());
//                      if(item.isSelected())
//                          setStyle(" -fx-background-color: Green");
//                      else
//                          setStyle(" -fx-background-color: RED");
                    }
//              }
            };
        }

    }
if(!getChildren().contains(item))
    getChildren().add(item);

但是它有缺陷,看起来不太好,并且在我开始滚动后添加了它(这对我来说是一种奇怪的行为)-->

除非您确实需要,否则不应该在item类中放置
节点。此外,除非您正在为此
控件编写
外观
,否则切勿直接访问
控件的子级

您应该将
布尔属性
添加到
服务器
类:

private final BooleanProperty window1 = new SimpleBooleanProperty();

public boolean isWindow1() {
    return window1.get();
}

public void setWindow1(boolean value) {
    window1.set(value);
}

public BooleanProperty window1Property() {
    return window1;
}
TableColumn窗口1;
callbackfactory=new BooleanColorCellFactory();
//cellValueFactory返回属性
window1.setCellValueFactory(新属性ValueFactory(“window1”);
窗口1.设置单元工厂(工厂);
...
窗口2.设置单元工厂(工厂);
@覆盖
公共TableCell调用(TableColumn参数){
返回新的TableCell(){
私有最终复选框CheckBox=新复选框();
{
复选框.selectedProperty().addListener((o,oldValue,newValue)->{
//在行项目中保存新值
WritableValue属性=(WritableValue)getTableColumn().getCellObservableValue​(getIndex());
属性设置值(newValue);
});
}
@凌驾
受保护的void updateItem(布尔项,布尔空){
super.updateItem(项,空);
if(空| |项==null){
设置图形(空);
设置样式(空);
}否则{
设置图形(复选框);
复选框.setSelected(项目);
设置样式(项目?-fx背景色:绿色):“-fx背景色:红色”);
}
}
};
}

相应地处理
窗口2

为什么复选框是最终的?为什么不是?每个单元格最多应创建一个,仅添加此关键字可防止意外重新分配值。此外,它需要初始化。确定。在实现代码后,我注意到一些奇怪的行为,您可以看到,当我在屏幕上只选中一个绿色的框时,在我向上滚动并向下返回后,您可以看到不止一个复选框被选中,单元格仍然是绿色的,但现在已选中。你知道发生了什么事吗?(屏幕外有更多复选框)完全忘记了在
updateItem
中设置复选框的选定状态,抱歉,现在应该修复了。。。
private final BooleanProperty window1 = new SimpleBooleanProperty();

public boolean isWindow1() {
    return window1.get();
}

public void setWindow1(boolean value) {
    window1.set(value);
}

public BooleanProperty window1Property() {
    return window1;
}
TableColumn<Server, Boolean> window1;
Callback<TableColumn<Server, Boolean>, TableCell<Server, Boolean>> factory = new BooleanColorCellFactory();

// cellValueFactory returns property
window1.setCellValueFactory(new PropertyValueFactory<>("window1"));
window1.setCellFactory(factory);

...

window2.setCellFactory(factory);
@Override
public TableCell<Server, Boolean> call(TableColumn<Server, Boolean> param) {

    return new TableCell<Server, Boolean>(){

        private final CheckBox checkBox = new CheckBox();

        {
            checkBox.selectedProperty().addListener((o, oldValue, newValue) -> {
                // save new value in row item
                WritableValue<Boolean> property = (WritableValue<Boolean>) getTableColumn().getCellObservableValue​(getIndex());
                property.setValue(newValue);
            });
        }

        @Override
        protected void updateItem(Boolean item, boolean empty) {
            super.updateItem(item, empty);

            if (empty || item == null) {
                setGraphic(null);
                setStyle(null);
            } else {
                setGraphic(checkBox);
                checkBox.setSelected(item);
                setStyle(item ? "-fx-background-color: Green" : "-fx-background-color: RED");
            }
        }
    };
}