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

JavaFx How to make checkbox visible in tableColumnCell using cellFactory

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

我想用 cellFactory 函数实现这个 ---> checkBoxVisible

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

window1.setCellFactory(new BooleanColorCellFactory());
window2.setCellFactory(new BooleanColorCellFactory());

这是 BooleanColorCellFactory Class

        @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");
                    }
//              }
            };
        }

    }

我尝试了一些方法,但没有任何效果。

我需要在 BooleanColorCellFactory 中添加什么才能完成这项工作?

更新:

所以我一直在玩,通过将其添加到 BooleanColorCellFactory Class

中,我设法更接近解决方案
if(!getChildren().contains(item))
    getChildren().add(item);

但它有问题而且看起来不太好,它是在我开始滚动后添加的(这对我来说是奇怪的行为)--> click

你不应该把 Node 放在项目 class 里面,除非你真的需要。此外,永远不要直接访问 Control 的子级,除非您为此 Control.

编写 Skin

您应该将 BooleanProperty 添加到 Server class:

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

相应地进行 window2