java - 使用单元工厂时 ComboBox.setValue(T) 不调用 updateItem(T,boolean)

标签 java javafx-2

我已经重写了 ListCell.updateItem(T, boolean) 来为我的 ComboBox 项目提供自定义渲染器(根据 Oracle ComboBox tutorial ),并且这工作正常,除非我使用 ComboBox.setValue(T) 以编程方式设置项目.

而是调用 T 的 toString() 方法。正在设置的项目已经在支持 ComboBox 的 ObservableList 中。

comboBox.setCellFactory(new Callback<ListView<MyType>, ListCell<MyType>>()
{
  @Override
  public ListCell<MyType> call(ListView<MyType> arg0)
  {
    return new ListCell<MyType>()
    {
      @Override
      protected void updateItem(MyType item, boolean empty)
      {
        super.updateItem(item, empty);

        if (item == null || empty)
        {
          setText("");
        }
        else
        {
          setText(item.myCustomRenderMethod());
        }
      }
    };
  }
});

我需要重写其他方法吗?

JDK1.7.0_45 上的 JavaFX2。

谢谢。

最佳答案

好的,在这里找到答案:JavaFx Editable ComboBox : Showing toString on item selection

您还需要重写 ComboBox.setConverter() 以确保所选对象显示正确的文本。这不在 Oracle 教程中,并且违反了最不意外的原则,因为它重复了 ListCell.updateItem() 中的一些代码

 comboBox.setConverter(new StringConverter<MyType>() {
  @Override
  public String toString(MyType obj) {
    if (obj == null)
    {
      return "";
    }
    else 
    {
      return obj.myCustomRenderMethod();
    }
  }

  @Override
  public MyType fromString(String s)
  {

      return null;  
  }
});

关于java - 使用单元工厂时 ComboBox.setValue(T) 不调用 updateItem(T,boolean),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20401732/

相关文章:

Java 8 多重映射

java - 将 jackson 中的一个字段从字符串更改为 json 对象

image-processing - 如何在 JavaFX 中更改图像的颜色

Netbeans 平台应用程序中的 JavaFx 2.0 GUI

SortedArrayList 中的 Java.lang.AssertionError

java - 私有(private)内部类合成了意外的匿名类

JavaFx2 IllegalStateException 与 Label.setText

重置先前的选择后,JavaFX ComboBox 在下拉列表中的选择上未显示相同的值

java - Wicket 口中的业务逻辑,其中有一些推荐的放置逻辑的位置(加载逻辑)

javafx - 鼠标悬停更改图标