我想将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
答案 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
进行相应操作