gpt4 book ai didi

java - JavaFX TableView 中的遗留 bean 未更新

转载 作者:行者123 更新时间:2023-11-29 03:05:47 28 4
gpt4 key购买 nike

我们正在将 JavaFX 集成到包含许多“原始”Java bean 的大型遗留代码库中,即使用 java.beans.PropertyChangeSupport 实现的类型。

JavaFX 不支持更新这些 bean 样式,仅支持初始值,如 javafx.scene.control.cell.PropertyValueFactory 中所述

If no method matching this pattern exists, there is fall-through support for attempting to call get() or is() (that is, getFirstName() or isFirstName() in the example above). If a method matching this pattern exists, the value returned from this method is wrapped in a ReadOnlyObjectWrapper and returned to the TableCell. However, in this situation, this means that the TableCell will not be able to observe the ObservableValue for changes (as is the case in the first approach above).

将 bean 升级到属性 API 不是一个选项,因为它们位于单独的代码库中,我们不希望在其上添加 JavaFX 依赖项,因为遗留 Java 6 项目仍在使用它。

我的问题是,如何在属性更改时让 TableView 更新,而不必在表中的所有单个 bean 上添加/删除监听器。

我正在考虑创建我自己的支持此功能的 PropertyValueFactory 版本,但我想知道是否还有其他可能的解决方案。

我举了两个例子来说明这一点。

使用老式 bean 的 TableView

public class OldBeanTableView extends Application {
public class OldBean {
private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public static final String PROPERTY_NAME_FOO = "foo";
private int foo = 99;

public int getFoo() {
return foo;
}

public void setFoo(int foo) {
int oldValue = this.foo;
this.foo = foo;
pcs.firePropertyChange(PROPERTY_NAME_FOO, oldValue, foo);
}

public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}

public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
}

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
ObservableList<OldBean> beans = FXCollections.observableArrayList();
beans.add(new OldBean());

TableView<OldBean> tableView = new TableView<>();
TableColumn<OldBean, Integer> column = new TableColumn<OldBeanTableView.OldBean, Integer>();
tableView.getColumns().add(column);
column.setCellValueFactory(new PropertyValueFactory<>("foo"));

tableView.setItems(beans);
primaryStage.setScene(new Scene(tableView));
primaryStage.show();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> beans.get(0).setFoo(beans.get(0).getFoo() + 1), 0,
1, TimeUnit.SECONDS);
}

}

使用新 bean 的 TableView

public class NewBeanTableView extends Application {

public class NewBean {
private IntegerProperty fooProperty = new SimpleIntegerProperty(0);

public int getFoo() {
return fooProperty.get();
}

public void setFoo(int foo) {
fooProperty.set(foo);
}

public IntegerProperty fooProperty() {
return fooProperty;
}
}

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {

ObservableList<NewBean> beans = FXCollections.observableArrayList();
beans.add(new NewBean());

TableView<NewBean> tableView = new TableView<>();
TableColumn<NewBean, Integer> column = new TableColumn<NewBeanTableView.NewBean, Integer>();
tableView.getColumns().add(column);
column.setCellValueFactory(new PropertyValueFactory<>("foo"));

tableView.setItems(beans);
primaryStage.setScene(new Scene(tableView));
primaryStage.show();
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> beans.get(0).setFoo(beans.get(0).getFoo() + 1), 0,
1, TimeUnit.SECONDS);
}

}

最佳答案

将 JavaBeanProperty 用作 valueFactory 的一个非常简单的示例:

Callback<CellDataFeatures<OldBean, Integer>, ObservableValue<Integer>> valueFactory = cdf -> {
OldBean bean = cdf.getValue();
JavaBeanObjectProperty<Integer> wrappee;
try {
wrappee = JavaBeanObjectPropertyBuilder.create()
.name("foo").bean(bean).build();

return wrappee;
} catch (Exception e) {
e.printStackTrace();
}
return null;
};
column.setCellValueFactory(valueFactory);

请注意,bean 必须具有方法 add/removePropertyChangeListeners(您的真实 bean 无论如何都会有 :-) 才能工作。

关于java - JavaFX TableView 中的遗留 bean 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32270811/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com