2009-04-02 12 views
13

Sto utilizzando un TableViewer con un provider di contenuti, un provider di etichette, un ICellModifier e TextCellEditors per ogni colonna.Utilizzo di Eclipse TableViewer, come faccio a navigare e modificare le celle con i tasti freccia?

Come è possibile aggiungere la navigazione con i tasti freccia e la modifica della cella quando l'utente seleziona la cella? Mi piacerebbe che questo fosse il più naturale possibile.

Dopo aver esaminato alcuni degli esempi online, sembra che ci sia un vecchio modo (con un TableCursor) e un nuovo modo (TableCursor non si mescola con CellEditors ??).

Attualmente, il mio TableViewer senza un cursore scorrerà solo nella prima colonna. La tabella SWT sottostante mostra il cursore come null.

Esiste un buon esempio di TableViewer utilizzando CellEditors e la navigazione della cella tramite tastiera?

Grazie!

risposta

3

Non so se v'è un buon esempio. Uso un cluster di codice personalizzato per ottenere quelli che considero i comportamenti di base della tabella per la mia applicazione che funziona su TableViewer. (Si noti che stiamo ancora destinati a 3.2.2, a questo punto, quindi forse le cose sono migliorati o sono altrimenti cambiate.) Alcuni punti salienti:

  • faccio setCellEditors() sul mio TableViewer.
  • Su ciascun controllo di CellEditor, stabilisco quello che considero appropriato TraverseListener. Ad esempio, per celle di testo:

    cellEditor = new TextCellEditor(table, SWT.SINGLE | getAlignment()); 
    cellEditor.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         switch (e.detail) { 
         case SWT.TRAVERSE_TAB_NEXT: 
          // edit next column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_TAB_PREVIOUS: 
          // edit previous column 
          e.doit = true; 
          e.detail = SWT.TRAVERSE_NONE; 
          break; 
    
         case SWT.TRAVERSE_ARROW_NEXT: 
          // Differentiate arrow right from down (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_DOWN) { 
           // edit same column next row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
    
         case SWT.TRAVERSE_ARROW_PREVIOUS: 
          // Differentiate arrow left from up (they both produce the same traversal @*$&#%^) 
          if (e.keyCode == SWT.ARROW_UP) { 
           // edit same column previous row 
           e.doit = true; 
           e.detail = SWT.TRAVERSE_NONE; 
          } 
          break; 
         } 
        } 
    }); 
    

(per celle a discesa, prendo a sinistra e freccia a destra, invece di su e giù.)

  • Ho anche aggiungere un TraverseListener al controllo di TableViewer il cui compito è quello di iniziare la modifica della cella se qualcuno colpisce "return" mentre è selezionata un'intera riga.

    // This really just gets the traverse events for the TABLE itself. If there is an active cell editor, this doesn't see anything. 
    tableViewer.getControl().addTraverseListener(new TraverseListener() { 
        public void keyTraversed(TraverseEvent e) { 
         if (e.detail == SWT.TRAVERSE_RETURN) { 
          // edit first column of selected row 
         } 
        } 
    }); 
    
  • Ora, come esattamente a controllare il montaggio è un'altra storia. Nel mio caso, il mio intero TableViewer (e una rappresentazione di ogni colonna in esso) viene avvolto in un oggetto personalizzato con metodi per fare ciò che dicono i commenti sopra. Le implementazioni di questi metodi alla fine finiscono per chiamare tableViewer.editElement() e quindi controllare tableViewer.isCellEditorActive() per vedere se la cella era effettivamente modificabile (quindi possiamo saltare alla successiva modificabile se non).

  • Ho trovato utile anche essere in grado di "abbandonare l'editing" a livello di programmazione (ad es. Quando si esce dall'ultima cella di una riga).Purtroppo l'unico modo che ho potuto venire con per farlo è un hack terribile determinato a lavorare con la mia versione particolare speleologia attraverso la fonte per le cose che produrrebbero gli "effetti collaterali" desiderati:

    private void relinquishEditing() { 
         // OMG this is the only way I could find to relinquish editing without aborting. 
         tableViewer.refresh("some element you don't have", false); 
        } 
    

Scusate, non posso dare una porzione più completa di codice, ma in realtà, dovrei rilasciare un intero mini-progetto di cose, e non sono pronto a farlo ora. Speriamo che questo sia abbastanza di un "jumpstart" per farti andare avanti.

0

ho ottenuto che funziona sulla base di questo JFace Snippet, ma ho dovuto copiare un paio di classi correlate anche:

  • org.eclipse.jface.snippets.viewers.TableCursor
  • org.eclipse.jface .snippets.viewers.CursorCellHighlighter
  • org.eclipse.jface.snippets.viewers.AbstractCellCursor

e non mi ricordo esattamente dove li ho trovati. È anche un org.eclipse.swt.custom.TableCursor, ma non ho potuto farlo funzionare.

0

Dai un'occhiata alla Example of enabling Editor Activation on a Double Click.

La roba tra le linee [110-128] aggiungere un ColumnViewerEditorActivationStrategy e TableViewerEditor. Nel mio caso volevo un singolo clic per iniziare a modificare, quindi ho cambiato la riga 115 da: ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION a ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION. Dopo averlo aggiunto al TableViewer, la chiave di tabulazione passerebbe da un campo all'altro con l'editor abilitato.

2

Ecco cosa ha funzionato per me:

TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,new FocusCellOwnerDrawHighlighter(tableViewer)); 
ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(tableViewer) { 
    protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) { 
     return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL 
      || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION         
      || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.keyCode == SWT.CR) 
      || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC; 
     } 
}; 

posso navigare in tutte le direzioni con scheda durante la modifica, e la freccia in giro quando non è in modalità di modifica.