我在 JavaFX 2 模式对话框窗口中有一个 ListView 控件。
此 ListView 显示 DXAlias 实例,其 ListCells 由单元工厂制造。工厂对象所做的主要工作是检查 ListView 的 UserData 属性数据,并将其与 ListCell 对应的项目进行比较。如果它们相同,则 ListCell 的内容呈现为红色,否则呈现黑色。我这样做是为了表明 ListView 中的哪些项目当前被选为“默认”。这是我的 ListCell 工厂类,所以你可以明白我的意思:
private class AliasListCellFactory implements
Callback<ListView<DXSynonym>, ListCell<DXSynonym>> {
@Override
public ListCell<DXSynonym> call(ListView<DXSynonym> p) {
return new ListCell<DXSynonym>() {
@Override
protected void updateItem(DXSynonym item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
DXSynonym dx = (DXSynonym) lsvAlias.getUserData();
if (dx != null && dx == item) {
this.setStyle("-fx-text-fill: crimson;");
} else { this.setStyle("-fx-text-fill: black;"); }
this.setText(item.getDxName());
} else { this.setText(Census.FORMAT_TEXT_NULL); }
}};
}
我有一个名为“handleAliasDefault()”的按钮处理程序,它通过获取选定的 DXAlias 实例并将其存储到 ListView 中,使 ListView 中的选定项成为新的默认值:lsvAlias.setUserData(selected DXAlias)。这是处理程序代码:
// Handler for Button[fx:id="btnAliasDefault"] onAction
@FXML
void handleAliasDefault(ActionEvent event) {
int sel = lsvAlias.getSelectionModel().getSelectedIndex();
if (sel >= 0 && sel < lsvAlias.getItems().size()) {
lsvAlias.setUserData(lsvAlias.getItems().get(sel));
}
}
因为响应单击“设置默认值”按钮所做的更改是更改 ListView 的 UserData() 而不对支持的 ObservableList 进行任何更改,所以列表没有正确指示新的默认值。
有没有办法强制 ListView 重新渲染它的 ListCells?Android 用户在这个主题上提出了千万个问题,但 JavaFX 似乎并不快乐。我可能必须对支持数组进行“无意义的更改”以强制重绘。
我看到 JavaFX 2.1 要求这样做:Javafx ListView refresh