Ste*_*ven 8 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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后有一个选择框如下:
ChoiceBox<Test> chi = new ChoiceBox<>();
ObservableList<Test> items = FXCollections.observableArrayList();
chi.setItems(items);
items.addAll(new Test("ITEM1"),new Test("ITEM2"),new Test("ITEM3"));
Run Code Online (Sandbox Code Playgroud)
ChoiceBox将显示ITEM1,ITEM2和ITEM3列表
如果我然后通过以下代码更改其中一个项目的名称:
items.get(1).setName("CHANGED");
Run Code Online (Sandbox Code Playgroud)
ChoiceBox仍将显示ITEM1,ITEM2和ITEM3列表.我该如何制作,以便choiceBox更新并显示列表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<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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3039 次 |
| 最近记录: |