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