2014-11-28 26 views
5

In un JavaFX TableView, come posso determinare le variazioni diJavaFX: salvare e ripristinare lo stato visivo del TableView (ordine, la larghezza e la visibilità)

  • I. L'ordine delle colonne [risolto]
  • II. La larghezza della colonna [risolta]
  • III. La visibilità della colonna [risolto]

per salvarle nelle preferenze e ripristinarle, la prossima volta che avvio un'applicazione?

I. Per La colonna

ora funziona. Tuttavia, wasRemoved() viene attivato quando si riordinano le colonne, non wasPermutation().

final List<TableColumn<MyType, ?>> unchangedColumns = Collections.unmodifiableList(new ArrayList<TableColumn<MyType, ?>>(columns)); 

columns.addListener(new ListChangeListener<TableColumn<MyType, ?>>() { 
    @Override 
    public void onChanged(ListChangeListener.Change<? extends TableColumn<MyType, ?>> change) { 
    while (change.next()) { 
     if (change.wasRemoved()) { 
     ObservableList<TableColumn<MyType, ?>> columns = table.getColumns(); 
     int[] colOrder = new int[columns.size()]; 

     for (int i = 0; i < columns.size(); ++i) { 
      colOrder[i] = unchangedColumns.indexOf(columns.get(i)); 
     } 

     // colOrder will now contain current order (e.g. 1, 2, 0, 5, 4) 
     } 
    } 
    } 
}); 

II. La larghezza della colonna

Questo sta funzionando.

for (TableColumn<MyType, ?> column: columns) { 
    column.widthProperty().addListener(new ChangeListener<Number>() { 
    @Override 
     public void changed(ObservableValue<? extends Number> observableValue, Number oldWidth, Number newWidth) { 
     logger.info("Width: " + oldWidth + " -> " + newWidth); 
    }); 
} 

III. Visibilità della colonna

Questo è il trucco.

for (TableColumn<MyType, ?> column: columns) { 
    column.visibleProperty().addListener(new ChangeListener<Boolean>() { 
    @Override 
     public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVisibility, Boolean newVisibility) { 
     logger.info("Visibility: " + oldVisibility + " -> " + newVisibility); 
    }); 
} 
+0

Gestito per gestire ora la larghezza della colonna e l'ordine delle colonne. Tuttavia, non ho ancora idea della visibilità della colonna. – user1438038

+1

Hai provato 'column.visibleProperty()'? – ItachiUchiha

+1

Perché hai bisogno di ascoltatori? Non è sufficiente controllare questi quando l'applicazione si chiude, invece di aggiornare i valori ogni volta che cambiano? –

risposta

0

FWIW - il seguente codice è il complemento alla prima parte della domanda, di applicare l'ordine delle colonne salvato:

private void applyColumnOrder(int[] order) {  
    ObservableList<TableColumn<MyType, ?>> columns = getColumns(); 

    if (order.length == columns.size()) { 
     columns.clear(); 

     for (int ix = 0; ix < order.length; ix++) { 
      columns.add(unchangedColumns.get(order[ix])); 
     } 
    } 
} 

In cima, qui alcuni metodi per persistendo l'ordine tabella di ordinamento :

1

Ho implementato un semplice TableView personalizzato come estensione di TableView per l'archiviazione automatica dell'ordine e della larghezza delle colonne. Si basa sulla soluzione data nella domanda. Il mio TableView personalizzato è chiamato PropertySaveTableView.

Potete trovare qui: https://gist.github.com/y4nnick/ca976e58be23aab20dfbc8d81ea46816

Il "EinstellungService.java" è solo un'interfaccia per la memorizzazione permanente delle proprietà. Devi creare la tua implementazione con la tua tecnologia preferita.

Forse aggiungerò il salvataggio della visibilità in seguito, se così ti farò sapere qui.