这个ListView显示DXAlias实例,ListCell是由cell factory制造的。factory对象的主要作用是检查ListView的UserData属性数据,并将其与相应的ListCell项目进行比较。如果它们相同,则ListCell的内容将以红色呈现,否则为黑色。我这样做是为了指示ListView中哪个项目当前被选为“默认”。以下是我的ListCell factory类,以便您了解我的意思:
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中来使选定项成为新的默认选项: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 refreshing
item.name.set(6)
,例如,您将看到ListValue正确更新。根据您的用例,在Custom
类上使用非默认构造函数可能会更好。 - Andrey