【发布时间】:2016-07-05 21:46:54
【问题描述】:
我有一个 Java 8 可编辑 ComboBox,其中默认项为粗体,非默认项由 CellFactory 非粗体。 当默认值更改为另一个项目时,我发现让 CellFactory 将新默认值加粗和旧默认值不加粗的唯一方法是删除并重新添加旧的和新的默认项目。这需要相当多的代码来处理新项目变为当前项目,因为之前的当前项目已被删除,然后将当前项目设置为我们正在修改的项目。
有没有一种很好的方法可以将一个单元格标记为脏并需要重新渲染,这样我就不必删除并重新添加 2 个单元格?
我已经用谷歌搜索了半天,但也许我没有问对正确的问题。
我想如果我只是清除所有组合框项并重新添加它们,控制代码会更简单,但这不是很有效。
编辑:根据要求,这里是 CellFactory:
bookComboBox.setCellFactory(
new Callback<ListView<String>, ListCell<String>>() {
@Override public ListCell<String> call(ListView<String> param) {
final ListCell<String> cell = new ListCell<String>() {
{
super.setPrefWidth(100);
}
@Override public void updateItem(String item,
boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
if (item.equals(Book.getDefaultBook())) {
setFont(Font.font("System", FontWeight.BOLD, 14));
System.out.println("bookComboBox.setCellFactory: set BOLD item=" + item);
}
else {
setFont(Font.font("System", FontWeight.NORMAL, 14));
System.out.println("bookComboBox.setCellFactory: set NORMAL item=" + item);
}
}
else {
setText(null);
}
}
};
return cell;
}
});
我没有改变单元格的值,只是渲染时使用的字体。 我没有使用 onEditCommit()。 我使用 bookComboBox.setOnAction 侦听器对组合框选择更改做出反应。 当在组合框中输入文本并按下操作键 (ENTER) 或组合框失去焦点时,也会发生 setOnAction 事件。
【问题讨论】:
-
CellFactory是如何实现的?据推测,所需要的只是更新其中的控件......
-
请显示一些代码,或者您使用
onEditCommit?原则上,单元格应该自动重新渲染。 -
@jorn:单元格只会自动渲染一次。看来您必须更改单元格中的值或再次删除/添加它才能重新渲染它。所有这些选项都会导致发生不需要的 ComboBox.setOnAction 事件。
-
我从docs.oracle.com/javase/8/javafx/api/javafx/scene/control/… 看到,仅呈现显示 VisibleRowCount 所需的单元格,因此如果滚动列表,则可能会重新呈现单元格,但这对我没有帮助.