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