2013-10-08 46 views
8

Person类型的ComboBox<Perosn>,我在其中添加了Person类的几个对象,了JavaFx编辑ComboBox:在项目选择显示的toString

我用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()人类的方法。

正常情况: Normal Case

可编辑的案例: Editable Case

对此有任何解决方案?

我有一个模型类,

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 + '}'; 
    } 
} 

回答

11

下面是我自己的问题的答案,我经过许多努力和改正后发现最好。

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(); 
} 
+1

你有没有看我的答案,让正确的解决方案,并发布时间1时段来的问题已提交后? – Sebastian

15

您需要设置组合框一个StringConverter为目的(有没有其他办法,看组合框的源代码)

这里一个例子:

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.stage.Stage; 
import javafx.util.StringConverter; 

import java.util.Arrays; 
import java.util.List; 

public class ComboBoxTest extends Application { 
    private ComboBox<Integer> cmb_year = new ComboBox<>(); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Group root = new Group(); 
     root.getChildren().add(cmb_year); 
     cmb_year.setPrefWidth(150); 
     Scene scene = new Scene(root, 500, 500); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     List<Integer> ints = Arrays.asList(2012, 2013, 2014, 2015); 
     cmb_year.getItems().addAll(ints); 

     cmb_year.setConverter(
      new StringConverter<Integer>() { 
       @Override 
       public String toString(Integer integer) { 
        if (integer == null) { 
         return ""; 
        } else { 
         return "that's a year: " + integer.intValue(); 
        } 
       } 

       @Override 
       public Integer fromString(String s) { 
        try { 
         return Integer.parseInt(s); 
        } catch (NumberFormatException e) { 
         return null; 
        } 
       } 
      }); 

     cmb_year.setPromptText("select year"); 
     cmb_year.setEditable(true); 

     Button distraction = new Button("distraction"); 
     distraction.setLayoutX(100); 
     distraction.setLayoutY(100); 
     root.getChildren().add(distraction); 
    } 
} 

结果:

enter image description here enter image description here