JavaFx可编辑组合框:显示项目选择上的toString [英] JavaFx Editable ComboBox : Showing toString on item selection

查看:507
本文介绍了JavaFx可编辑组合框:显示项目选择上的toString的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有类型 Person ComboBox< Perosn> ,其中我已经添加了少量对象 Person class,



我使用了 setCellFactory(Callback)在ComboBox中显示Person名称下拉

  combobox.setCellFactory(
new Callback< ListView< Person>,ListCell< ; Person>>(){
@Override
public ListCell< Person> call(ListView< Person> p){
ListCell cell = new ListCell< Person> {
@Override
protected void updateItem(Person item,boolean empty){
super.updateItem(item,empty);
if(empty){
setText );
} else {
setText(item.getName());
}
}
};
return cell;
}
});

并且, setButtonCell(ListCell)

  combobox.setButtonCell(
new ListCell< Object>(){
@Override
protected void updateItem(Person t,boolean bln){
super.updateItem(t,bln);
if bln){
setText();
} else {
setText(t.getName());
}
}
}

这在正常情况下工作得很好,但是当我使用可编辑的combobox时,

当我写时, combobox.setEditable(true); 然后在项目选择上combobox的文本字段c $ c> toString()人类类的方法。



正常情况:



可编辑案例:



有没有任何解决方案?



我有一个模型类,

  public class Person {
String name;
int age

public String getName(){
return name;
}

public void setName(String name){
this.name = name;
}

public int getAge(){
return age;
}

public void setAge(int age){
this.age = age;
}

@Override
public String toString(){
returnPerson {+name =+ name +,age =+ age + '}';
}
}


解决方案

是对我自己的问题的答案,我在许多努力和更正后发现最好的。

  mainComboBox.setButtonCell(
new ListCell< Object>(){
@Override
protected void updateItem(Object t,boolean bln){
super.updateItem(t,bln);
if(bln){
setText();
} else {
setText(getStringField(t));
}
}
}

mainComboBox.setConverter(
new StringConverter(){
private Map< String,Object> map = new HashMap<>();

@Override
public String toString(Object t){
if(t!= null){
String str = getStringField(t);
map.put(str,t) ;
return str;
} else {
return;
}
}

@Override
public Object fromString (String string){
if(validate&&!map.containsKey(string)){
mainComboBox.setValue(null);
mainComboBox.getEditor
return null;
}
return map.get(string);
}
});

mainComboBox.setCellFactory(
new Callback< ListView< Object>,ListCell< Object>>(){
@Override
public ListCell< Object> call ListView< Object> p){
ListCell cell = new ListCell< Object>(){
@Override
protected void updateItem(Object item,boolean empty){
super.updateItem (item,empty);
if(empty){
setText();
} else {
setText(getStringField(item));
}
}
}; return cell;
}
});

并具有的必需函数getStringField(Object)

  public String getStringField(Object o){
return((Pesron)o).getName
}


I have a ComboBox<Perosn> of type Person , in which I have added few object of Person class,

I have used setCellFactory(Callback) method to show Person name in ComboBox drop down

combobox.setCellFactory(
    new Callback<ListView<Person >, ListCell<Person >>() {
        @Override
        public ListCell<Person > call(ListView<Person > p) {
            ListCell cell = new ListCell<Person >() {
                @Override
                protected void updateItem(Person item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setText("");
                    } else {
                        setText(item.getName());
                    }
                }
            };
            return cell;
        }
    });

And, setButtonCell(ListCell) method to show name in combobox on selection.

combobox.setButtonCell(
    new ListCell<Object>() {
        @Override
        protected void updateItem(Person t, boolean bln) {
            super.updateItem(t, bln); 
            if (bln) {
                setText("");
            } else {
                setText(t.getName());
            }
        }
    });

This works perfectly good with normal case but when I use editable combobox then this fails.

When I write , combobox.setEditable(true); then on item selection the text field (editor) of combobox shows toString() method of person class.

Normal Case :

Editable Case :

Is there any solution for this ??

I have a model class,

public class Person {
    String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" + "name=" + name + ", age=" + age + '}';
    }
}

解决方案

Here is an answer to my own question which I found best after many efforts and corrections.

mainComboBox.setButtonCell(
    new ListCell<Object>() {
        @Override
        protected void updateItem(Object t, boolean bln) {
            super.updateItem(t, bln);
            if (bln) {
                setText("");
            } else {
                setText(getStringField(t));
            }
        }
    });

mainComboBox.setConverter(
    new StringConverter() {
        private Map<String, Object> map = new HashMap<>();

        @Override
        public String toString(Object t) {
            if (t != null) {
                String str = getStringField(t);
                map.put(str, t);
                return str;
            } else {
                return "";
            }
        }

        @Override
        public Object fromString(String string) {
            if (validate && !map.containsKey(string)) {
                mainComboBox.setValue(null);
                mainComboBox.getEditor().clear();
                return null;
            }
            return map.get(string);
        }
    });

mainComboBox.setCellFactory(
    new Callback<ListView<Object>, ListCell<Object>>() {
        @Override
        public ListCell<Object> call(ListView<Object> p) {
            ListCell cell = new ListCell<Object>() {
                @Override
                protected void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty) {
                        setText("");
                    } else {
                        setText(getStringField(item));
                    }
                }
            };return cell;
        }
    });

And with required function of getStringField(Object),

public String getStringField(Object o) {
    return ((Pesron) o).getName();
}

这篇关于JavaFx可编辑组合框:显示项目选择上的toString的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆