我已经重写了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。
感谢。
答案 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));
我最好的猜测是在ComboBox
是Scene
的一部分之前设置值会导致问题。另外,请确保使用setButtonCell(...)
的{{1}}方法。