ObservableList侦听器不起作用

时间:2017-10-21 17:19:19

标签: java user-interface javafx

我正在使用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);
    }
});

2 个答案:

答案 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); }); 中的代码只应该是启动并运行应用程序的内容。