我在JavaFX 2模式对话窗口中有一个ListView控件。JavaFX 2.2:如何强制重绘/更新ListView
此ListView显示DXAlias实例,它由单元工厂生产的ListCells。工厂对象所做的主要事情是检查ListView的UserData属性数据,并将其与ListCell对应的项目进行比较。如果它们相同,则ListCell的内容呈现为红色,否则呈现为黑色。我这样做是为了表明ListView中的哪些项目当前被选作“默认”。这里是我的ListCell工厂类,所以你可以明白我的意思:
private class AliasListCellFactory implements
Callback, ListCell> {
@Override
public ListCell call(ListView p) {
return new ListCell() {
@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(选定的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似乎并没有幸福。我可能不得不对后备阵列进行“无意义的改变”来强制重绘。
2013-06-02
scottb