我有一个ComboBox<Perosn>
type Person
,其中添加了一些Person
class对象,
我已使用setCellFactory(Callback)
方法在组合框下拉列表中显示人名
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
。
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.setEditable(true);
然后在项目选择上,组合框的文本字段(编辑器)显示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() {
return "Person{" + "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().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;
}
});
并与所需的功能getStringField(Object)
,
public String getStringField(Object o) {
return ((Pesron) o).getName();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句