具有简单 xml 模型的 JavaFX TableView
JavaFX TableView with simple xml model
对于配置,我使用简单的 xml。我也将此模型用于 TableView。我的问题是使用布尔值。 TableView 需要 BooleanProperty,但显然 xml 无法访问此对象。我如何在不编写大代码的情况下将其结合起来?
型号
@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
@Element (required=true)
private String title;
@Element (required=false)
private BooleanProperty active;
/**
*
* @param title
* @param active
*/
public ScriptData() {
this.active = new SimpleBooleanProperty(active);
}
public boolean isActive() {
return active.getValue();
}
public void setActive(boolean active) {
this.active.set(active);
}
细胞工厂
modulActiveColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
modulActiveColumn.setCellFactory(CheckBoxTableCell.forTableColumn(modulActiveColumn));
modulActiveColumn.setOnEditCommit((EventHandler<CellEditEvent>) t -> {
((ScriptData) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setActive((boolean) t.getNewValue());
}
My problem is using of boolean. TableView needs BooleanProperty
你错了。事实上,TableView
永远无法访问存储在其项的 active
字段中的 BooleanProperty
对象。
PropertyValueFactory
使用反射
- 通过调用构造函数参数与
"Property"
连接的方法来访问 属性 对象。 (在您的情况下,此方法将被称为 activeProperty()
)。
- 如果以上方法不起作用,它会将 getter 为 属性 返回的值包装在
ObservableValue
中。 (在这种情况下 getter 的名称是 getActive()
或 isActive
)。
在您的情况下,cellValueFactory
执行类似于以下工厂的操作
modulActiveColumn.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().isActive()));
使用 boolean
字段存储数据与您的情况完全相同。这种方法的缺点是 属性 的编程更新不会触发 TableView
的更新,需要手动处理编辑。
@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
@Element (required=true)
private String title;
@Element (required=false)
private boolean active;
/**
*
* @param title
* @param active
*/
public ScriptData() {
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}
对于配置,我使用简单的 xml。我也将此模型用于 TableView。我的问题是使用布尔值。 TableView 需要 BooleanProperty,但显然 xml 无法访问此对象。我如何在不编写大代码的情况下将其结合起来?
型号
@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
@Element (required=true)
private String title;
@Element (required=false)
private BooleanProperty active;
/**
*
* @param title
* @param active
*/
public ScriptData() {
this.active = new SimpleBooleanProperty(active);
}
public boolean isActive() {
return active.getValue();
}
public void setActive(boolean active) {
this.active.set(active);
}
细胞工厂
modulActiveColumn.setCellValueFactory(new PropertyValueFactory<>("active"));
modulActiveColumn.setCellFactory(CheckBoxTableCell.forTableColumn(modulActiveColumn));
modulActiveColumn.setOnEditCommit((EventHandler<CellEditEvent>) t -> {
((ScriptData) t.getTableView().getItems().get(
t.getTablePosition().getRow())
).setActive((boolean) t.getNewValue());
}
My problem is using of boolean. TableView needs BooleanProperty
你错了。事实上,TableView
永远无法访问存储在其项的 active
字段中的 BooleanProperty
对象。
PropertyValueFactory
使用反射
- 通过调用构造函数参数与
"Property"
连接的方法来访问 属性 对象。 (在您的情况下,此方法将被称为activeProperty()
)。 - 如果以上方法不起作用,它会将 getter 为 属性 返回的值包装在
ObservableValue
中。 (在这种情况下 getter 的名称是getActive()
或isActive
)。
在您的情况下,cellValueFactory
执行类似于以下工厂的操作
modulActiveColumn.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().isActive()));
使用 boolean
字段存储数据与您的情况完全相同。这种方法的缺点是 属性 的编程更新不会触发 TableView
的更新,需要手动处理编辑。
@Root(name="scriptdata")
@Order(elements={"title", "active"})
public class ScriptData {
@Element (required=true)
private String title;
@Element (required=false)
private boolean active;
/**
*
* @param title
* @param active
*/
public ScriptData() {
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
}