Combobox JAVAFX可编辑组合框:更改值后刷新

Combobox JAVAFX可编辑组合框:更改值后刷新,combobox,javafx,converter,edit,Combobox,Javafx,Converter,Edit,我对JavaFX还是新手,需要创建一个包含对象(SimlpePerson)而不是字符串的组合框。我想编辑框中显示的值。适用于字符串,但我对SimpleObject有问题。我制作了一个StringConverter,它也可以工作,我可以编辑组合框中显示的对象。但该名单本身在那之后不会重新公布。如果单击组合框,我会看到原始值。我怎样才能改变这一点 欢迎提出任何建议!=) BR谢谢你! 斯特凡 导入javafx.application.application; 导入javafx.beans.prope

我对JavaFX还是新手,需要创建一个包含对象(SimlpePerson)而不是字符串的组合框。我想编辑框中显示的值。适用于字符串,但我对SimpleObject有问题。我制作了一个StringConverter,它也可以工作,我可以编辑组合框中显示的对象。但该名单本身在那之后不会重新公布。如果单击组合框,我会看到原始值。我怎样才能改变这一点

欢迎提出任何建议!=)

BR谢谢你! 斯特凡

导入javafx.application.application;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.beans.property.StringProperty;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.scene.scene;
导入javafx.scene.control.ComboBox;
导入javafx.scene.control.TableView;
导入javafx.stage.stage;
导入javafx.util.StringConverter;
公共类ComboBoxDemo扩展了应用程序{
公共类SimplePerson{
私有财产名称;
私有字符串somethingElse;
公共SimplePerson(字符串名称){
集合名(名称);
}
public final void setName(字符串值){nameProperty().set(值);}
公共字符串getName(){return nameProperty().get();}
公共字符串属性nameProperty(){
如果(name==null)name=newSimpleStringProperty(此“名称”);
返回名称;
}
}
最终可观察列表人员=FXCollections.observableArrayList(
新SimplePerson(“Jacob”),
新SimplePerson(“伊莎贝拉”),
新SimplePerson(“Ethan”),
新SimplePerson(“Emma”),
新SimplePerson(“迈克尔”)
);
@凌驾
public void start(Stage)引发异常{
//TODO自动生成的方法存根
最终组合框cb=新组合框();
cb.设置项目(人);
cb.setEditable(true);
cb.setConverter(新的StringConverter(){
@凌驾
公共字符串到字符串(SimplePerson p)
{
如果(p!=null)
返回p.getName();
返回“”;
}
@凌驾
公共SimplePerson fromString(字符串名称)
{
如果(cb.getValue()!=null)
{
((SimplePerson)cb.getValue()).setName(name);
cb.show();
return(SimplePerson)cb.getValue();
}
返回null;
}
});
舞台场景(新场景(cb));
stage.show();
}
公共静态void main(字符串[]args){launch(args);}
}
退房。有一个处理程序在您完成编辑后触发。在那里,您可以实现更改模型状态的所有代码

要更新组合框列表,可能需要以下方法:

 cb.getEditor().setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            SimplePerson person = cb.getValue();
            if (null != person) {
                int idx = persons.indexOf(person);
                person.setName(cb.getEditor().getText());
                persons.set(idx, person);
                cb.setValue(person);
            }
        }
    });
cb.getEditor().setOnAction(新的EventHandler()){ @凌驾 公共无效句柄(ActionEvent ActionEvent){ SimplePerson person=cb.getValue(); 如果(空!=人){ int idx=人。indexOf(人); person.setName(cb.getEditor().getText()); 人.集(idx,人); cb.设定值(人); } } });
学生你好,谢谢你的贡献。我添加了Java7风格的处理程序。现在效果更好了,但并非总是如此。请尝试代码,选择“Emma”并将其更改为“Emma 123”。用回车键确认。如果打开该组合,则可以在列表中看到“Emma 123”。跟伊莎贝拉重复一遍。在组合框列表中,您仍然会看到“Isabella”而不是“Isabella 123”
 cb.getEditor().setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            SimplePerson person = cb.getValue();
            if (null != person) {
                int idx = persons.indexOf(person);
                person.setName(cb.getEditor().getText());
                persons.set(idx, person);
                cb.setValue(person);
            }
        }
    });