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

时间:2014-02-18 12:38:59

标签: java object javafx-2

我有一个表示列表对象的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<Test> chi = new ChoiceBox<>();
ObservableList<Test> 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列表。我该如何制作,以便choiceBox更新并显示列表ITEM1,CHANGED和ITEM3?

3 个答案:

答案 0 :(得分:4)

为了完整性 - 在fx2中,您可能会遇到另一个答案中概述的replace approach。从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<Test> items = FXCollections.observableList(
    e -> new Observable[] {e.nameProperty()} );
items.addAll(...);
choiceBox = new ChoiceBox<>(items);
// tell the choice how to represent the item
StringConverter<Test> converter = new StringConverter<Test>() {

    @Override
    public String toString(Test album) {
        return album != null ? album.getName() : null;
    }

    @Override
    public Test fromString(String string) {
        return null;
    }

};
choiceBox.setConverter(converter);

答案 1 :(得分:1)

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

示例:

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

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和编程的新手。

答案 2 :(得分:-1)

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