JavaFX:使用对象属性的组合框

Posted

技术标签:

【中文标题】JavaFX:使用对象属性的组合框【英文标题】:JavaFX: ComboBox using Object property 【发布时间】:2017-05-03 05:35:27 【问题描述】:

假设我有一堂课:

public class Dummy 
    private String name;
    private String someOtherProperty;

    public String getName() 
       return name;
    

我有一个此类ArrayList<Dummy> dummyList;的ArrayList

我可以使用对象名称属性作为选择选项来创建 JavaFX 组合框,而无需使用对象名称创建新的 ArrayList<String>

伪代码:

ObservableList<Dummy> dummyO = FXCollections.observableArrayList(dummyList);
final ComboBox combo = new ComboBox(dummyO); // -> here dummyO.name?

(可选)理想情况下,虽然应该显示名称,但选择了一个选项时,combo.getValue()应该返回所选虚拟的引用,而不仅是名称。这可能吗?

【问题讨论】:

【参考方案1】:

我假设您所指的 ComboBox 是:http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ComboBoxBase.html。因为getValue()public,你可以这样做:

public class MyComboBox<T> extends ComboBox<T> 
  private final Dummy dummy;
  public MyComboBox(Dummy dummy) 
    this.dummy = dummy;
  
  public T getValue() 
    return dummy.getName();
  

【讨论】:

谢谢。虽然我不相信您已经直接回答了我关于如何在 ComboBox 中显示属性而不是对象本身的问题,但创建自定义 ComboBox 类是一个不错的建议! 您为什么要这样做?这会将从getValue 返回的对象类型替换为String,这在许多情况下会导致ClassCastException。此外,无论ComboBox 中选择的值如何,您都将返回相同Dummy 的名称。最后但并非最不重要的一点是getValue()final,因此不能被覆盖。【参考方案2】:

您可以使用自定义cellFactory 以适合您需要的方式显示项目:

ComboBox<Dummy> comboBox = ...

Callback<ListView<Dummy>, ListCell<Dummy>> factory = lv -> new ListCell<Dummy>() 

    @Override
    protected void updateItem(Dummy item, boolean empty) 
        super.updateItem(item, empty);
        setText(empty ? "" : item.getName());
    

;

comboBox.setCellFactory(factory);
comboBox.setButtonCell(factory.call(null));

【讨论】:

以上是关于JavaFX:使用对象属性的组合框的主要内容,如果未能解决你的问题,请参考以下文章

组合框依赖于另一个组合框 - JavaFX

单击时在JavaFX中填充组合框

JavaFX:以编程方式展开组合框

组合框占位符 NullPointerException JavaFX

组合框奇怪的行为(JavaFX 8)

javafx 组合框下拉菜单从屏幕边缘出来