JavaFx如何使用cellFactory

时间:2018-07-30 12:46:05

标签: javafx javafx-8

我想将checkBox添加到tableCell中,但是我不知道如何在使用.setCellFactory时使checkBox可见

我想使用cellFactory函数---> checkBoxVisible

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

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

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

    }

我尝试了一些事情,但是没有任何作用。

我需要在BooleanColorCellFactory中添加什么才能使它工作?

更新:

所以我一直在玩耍,并且通过将其添加到BooleanColorCellFactory类中,从而设法进一步接近解决方案

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

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

1 个答案:

答案 0 :(得分:1)

除非确实需要,否则不应在项目类中放入Node。此外,除非您为此Control写一个Skin,否则切勿直接访问Control的子级。

您应该改为将BooleanProperty添加到Server类中:

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进行相应操作