JavaFx可编辑组合框:显示项目选择上的toString [英] JavaFx Editable ComboBox : Showing toString on item selection
问题描述
我有类型
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屋!