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
我想将复选框添加到 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