JavaFX 2.0选择框问题。 如何在更新对象时更新表示对象列表的choiceBox?

我有一个表示列表对象的choiceBox。 当代表其中一个对象的名称被另一位代码更改时,选择框的下拉列表中的名称不会更改。 例如,如果我有一个由列表Test对象组成的选择框。 测试代码如下所示:

class Test { String name; public Test(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return name; } } 

然后选择Box如下:

 ChoiceBox chi = new ChoiceBox(); ObservableList items = FXCollections.observableArrayList(); chi.setItems(items); items.addAll(new Test("ITEM1"),new Test("ITEM2"),new Test("ITEM3")); 

ChoiceBox将显示ITEM1,ITEM2和ITEM3列表

如果我然后通过以下代码更改其中一个项目的名称:

 items.get(1).setName("CHANGED"); 

ChoiceBox仍将显示ITEM1,ITEM2和ITEM3列表。 我如何才能使它更新并显示列表ITEM1,CHANGED和ITEM3?

只是为了完整 – 在fx2中你可能会遇到替换方法 ,如另一个答案中所述。 从fx8开始,有一种机制可以告诉列表监听其包含项的更改(当然,前提条件是您的项目具有属性并通知更改后的侦听器):

 /** changed item to * - use property and notify on change * - not override toString (for visuals, use converter instead) */ class Test { StringProperty name; public Test(String name) { setName(name); } public StringProperty nameProperty() { if (name == null) name = new SimpleStringProperty(this, "name"); return name; } public void setName(String name) { nameProperty().set(name); } public String getName() { return nameProperty().get(); } } // use in collection with extractor ObservableList items = FXCollections.observableList( e -> new Observable[] {e.nameProperty()} ); items.addAll(...); choiceBox = new ChoiceBox<>(items); // tell the choice how to represent the item StringConverter converter = new StringConverter() { @Override public String toString(Test album) { return album != null ? album.getName() : null; } @Override public Test fromString(String string) { return null; } }; choiceBox.setConverter(converter); 

我在JavaFX 8中也有同样的问题(也有ComboBox)。 通过删除项目然后在同一位置添加新项目,我能够获得相同的function。

例:

这将获取所选项目,创建一个新项目,然后调用replace方法:

 Channel selected = channelChoiceBox.getSelectionModel().getSelectedItem(); Channel newChan = new Channel("Example", "Channel"); replaceChannel(newChan, selected); 

这将用新的频道替换所选频道,有效地编辑它:

 private void replaceChannel(Channel newChan, Channel oldChan) { int i = channelChoiceBox.getItems().indexOf(oldChan); channelChoiceBox.getItems().remove(oldChan); channelChoiceBox.getItems().add(i, newChan); channelChoiceBox.setValue(newChan); } 

这不是理想的,而是完成工作。

免责声明:我是Java和编程的新手。

是。 这似乎是JavaFx的问题。 我也面对过那个。 使用ComboBox而不是可行的ChoiceBox。