我正在使用GUI编写应用程序,我需要将List
中的Model
包放在ListView
的GUI包中。
此列表在程序执行期间正在更改。在初始化List
是空的,但有一段时间它有一些元素,但ListView
没有更新。我找不到任何可以解决我的问题的东西。我是GUI应用程序的初学者,我把这段代码放在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);
}
});
答案 0 :(得分:0)
在JavaFX
中,您的模型应由属性和可观察集合组成。我猜你有一个不做的模型,你试着包装&#39;在需要时将您的模型转换为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
的{{1}}访问权限,而是使用依赖注入,但最终由您决定)
答案 1 :(得分:0)
您可以使用ListProperty
并绑定itemsProperty()
的{{1}}:
ListView
我是GUI应用程序的初学者,我将此代码放入其中 start(Stage primaryStage)方法,如果它可能是我的问题的根源?
通常,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);
});
中的代码只应该是启动并运行应用程序的内容。