ObservableList监听器不工作
问题描述:
我正在用GUI编写应用程序,并且我需要在GUI包中将List
从Model
包中放到ListView
中。ObservableList监听器不工作
这个列表在程序执行期间正在改变。在开始List
是空的,但有一段时间它有一些元素,但ListView
未更新。我无法找到任何可以解决我的问题的东西。我在GUI应用程序中是一个begginer,如果它可能是我的问题的根源,我把这个代码放在start(Stage primaryStage)
方法中?
ListView<String> currentRank = new ListView<>();
currentRank.setPrefSize(100,100);
ObservableList<String> items = FXCollections.observableList(EndRace.getRankList());
currentRank.setItems(items);
items.addListener(new ListChangeListener<String>() {
@Override
public void onChanged(ListChangeListener.Change<? extends String> c) {
System.out.println("list changed");
currentRank.setItems(items);
}
});
答
在JavaFX
你的模型应该由性能和可观察到的集合。我猜你有一个不这样做的模型,你试图在需要时将模型'包装'到JavaFX中,但不幸的是这并不起作用。如果添加删除项目的标准Java集合列表中的包裹观察到的列表不会被调用,因为标准Java集合名单是无法观测...
基本上,你EndRace.getRankList()
应该返回的ObservableList
。最初在您的EndRace
课程中,您创建了一个空的可观察列表并将您的项目添加到该列表。幸运的是ObservableList
是一个List
所以它不会混淆其他的东西了。然后,添加项目并将其删除到该可观察列表。
package model;
public class EndRace {
private ObservableList<String> rankList = FXCollections.observableArrayList();
public ObservableList<String> getRankList() {
return rankList;
}
}
package gui;
...
ListView<String> currentRank = new ListView(endRace.getRankList()));
(顺便说一句,我删除了static
访问EndRace
,使用依赖注入,而不是,但最多也就是你们的末日)
答
你可以使用一个ListProperty
并绑定ListView
的itemsProperty()
:
ListView<String> currentRank = new ListView<>();
ObservableList<String> items = FXCollections.observableArrayList();
ListProperty<String> listProperty = new SimpleListProperty<>(items);
currentRank.itemsProperty().bindBidirectional(listProperty);
listProperty.addListener((observable, oldList, newList) -> {
System.out.println("list changed");
//no need to call setItems() anymore as they are binded.
//currentRank.setItems(items);
});
我GUI应用程序中一个初学者,我把这个代码 开始(第一阶段primarySta ge)方法,如果它可能是我的问题的根源?
通常,start()
中的代码应该只能让应用程序启动并运行。