2017-10-21 215 views
0

我正在用GUI编写应用程序,并且我需要在GUI包中将ListModel包中放到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); 
    } 
}); 

回答

0

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,使用依赖注入,而不是,但最多也就是你们的末日)

0

你可以使用一个ListProperty并绑定ListViewitemsProperty()

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()中的代码应该只能让应用程序启动并运行。