Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用单元格工厂时,setValue(T)不调用updateItem(T,布尔值)_Java_Javafx 2 - Fatal编程技术网

Java 当使用单元格工厂时,setValue(T)不调用updateItem(T,布尔值)

Java 当使用单元格工厂时,setValue(T)不调用updateItem(T,布尔值),java,javafx-2,Java,Javafx 2,我已经重写了ListCell.updateItem(T,boolean),为我的ComboBox项提供了一个自定义呈现程序(根据),这可以正常工作,除非我使用ComboBox.setValue(T)以编程方式设置项 而是调用T的toString()方法。正在设置的项已在支持组合框的ObservableList中 comboBox.setCellFactory(new Callback<ListView<MyType>, ListCell<MyType>>()

我已经重写了ListCell.updateItem(T,boolean),为我的ComboBox项提供了一个自定义呈现程序(根据),这可以正常工作,除非我使用ComboBox.setValue(T)以编程方式设置项

而是调用T的toString()方法。正在设置的项已在支持组合框的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());
        }
      }
    };
  }
});
comboBox.setCellFactory(新回调()
{
@凌驾
公共ListCell调用(ListView arg0)
{
返回新的ListCell()
{
@凌驾
受保护的void updateItem(MyType项,布尔值为空)
{
super.updateItem(项,空);
如果(项==null | |空)
{
setText(“”);
}
其他的
{
setText(item.myCustomRenderMethod());
}
}
};
}
});
是否还有其他方法需要重写

JDK1.7.0_45上的JavaFX2


谢谢。

好的,在这里找到答案:

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

comboBox.setConverter(新的StringConverter(){
@凌驾
公共字符串到字符串(MyType obj){
if(obj==null)
{
返回“”;
}
其他的
{
返回obj.myCustomRenderMethod();
}
}
@凌驾
公共MyType fromString(字符串s)
{
返回null;
}
});

在我的例子中,使用
平台.runLater()解决了问题:

Platform.runLater(() -> comboBox.setValue(value));
我的最佳猜测是,在
组合框
之前设置一个值是
场景
的一部分会导致问题。另外,确保使用组合框的
方法
设置按钮单元格(…)

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