Ho un controllo ListView in una finestra di dialogo modale JavaFX 2.JavaFX 2.2: Come forzare un ridisegno/aggiornamento di un ListView
Questo ListView visualizza le istanze DXAlias, le ListCells per le quali sono fabbricati da una cella di produzione. La cosa principale che fanno gli oggetti factory è esaminare i dati delle proprietà UserData di ListView e confrontarli con l'elemento corrispondente a ListCell. Se sono uguali, i contenuti di ListCell sono resi in rosso, altrimenti neri. Lo faccio per indicare quale degli elementi in ListView è attualmente selezionato come "predefinito". Qui è la mia classe fabbrica ListCell modo da poter vedere quello che voglio dire:
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); }
}};
}
Ho un gestore di pulsante chiamata "handleAliasDefault()" che rende l'elemento selezionato in ListView nuova impostazione predefinita prendendo l'istanza DXAlias selezionato e memorizzandolo in ListView: lsvAlias.setUserData (DXAlias selezionato). Ecco il codice del gestore:
// 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));
}
}
perché il cambiamento che è fatto in risposta al clic sul pulsante Imposta predefinito è quello di cambiare UserData del ListView() senza alcuna modifica al ObservableList supporto, la lista non indica correttamente il nuovo predefinito.
C'è un modo per forzare un ListView a ri-renderizzare i suoi ListCell? Ci sono un quadrilione di domande da parte degli utenti Android su questo argomento, ma non sembra esserci felicità per JavaFX. Potrei dover apportare un "cambiamento senza significato" all'array di supporto per forzare un ridisegno.
vedo che questo è stato chiesto per JavaFX 2.1: Javafx ListView refreshing
non ha mostrato il codice, ma i dati per ListView si trovano in una ObservableList. Ciascuno degli elementi del modello di dati è una proprietà JavaFX. Il contratto per ListView dice che quando i dati cambiano, la vista viene automaticamente aggiornata. Non sembra dire nulla su cosa dovrebbe accadere quando il modo in cui i dati vengono visualizzati cambia quando i dati stessi non lo fanno. Aggiungere una nuova associazione può fornire una soluzione ... ma a scapito di un codice molto brutto e, forse, fragile. Tutto quello di cui ho bisogno è che i ListCell vengano ridisegnati quando il default selezionato cambia. – scottb
Questa è una proprietà comune di come funziona javafx 2: quando il nodo di scenegraph (cella particolare) modifica le sue proprietà, in modo che influenzi sulla rappresentazione visiva, scenegraph ridisegna quei nodi (celle) se necessario. Quindi, quando aggiorni l'aspetto visivo delle celle, queste verranno ridisegnate da scenegraph. –
Vedo quello che stai dicendo ... ma non penso nemmeno che dovrei essere costretto a rifattorizzare il mio modello di dati per includere una proprietà che non è in realtà una parte del mio modello di dati. Voglio solo che l'alias predefinito selezionato sia reso in rosso, invece che nero. Il mio problema sarebbe stato risolto se ci fosse un semplice metodo a mia disposizione: lsvAlias.requestRefresh(); – scottb