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

时间:2013-12-05 13:49:41

标签: java javafx-2

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

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

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。

感谢。

2 个答案:

答案 0 :(得分:1)

好的,在这里找到答案: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;  
  }
});

答案 1 :(得分:0)

就我而言,使用Platform.runLater()解决了该问题:

Platform.runLater(() -> comboBox.setValue(value));

我最好的猜测是在ComboBoxScene的一部分之前设置值会导致问题。另外,请确保使用setButtonCell(...)的{​​{1}}方法。