2013-04-20 6 views
5

Penso che il componente JTable dovrebbe fare un lavoro migliore di filtraggio delle chiavi che potrebbero iniziare a modificare. Voglio dire, con l'implementazione corrente, se digiti DEL, Ctrl + Shift + CANC, F5, F7, ad esempio, in una cella modificabile, apparirà l'editor di celle. Secondo me, avviare un editor di celle con chiavi come queste è molto poco intuitivo per l'utente finale.Iniziare la modifica in una cella JTable solo con chiavi ragionevoli

Inoltre, c'è un altro problema: JTable non è a conoscenza degli altri possibili legami di chiave definiti nel modulo. Se hai una combinazione di tasti Ctrl + Maiusc + C definita per un pulsante nel modulo, se digiti questa combinazione di tasti in JTable, la tabella inizierà la modifica e la tua azione di associazione ai tasti dei pulsanti verrà richiamata successivamente. Penso che ci dovrebbe essere un modo semplice per prevenire questo invece di disabilitare tutti quelli già definiti nella mappatura delle associazioni di chiavi della tabella.

C'è qualche componente di terze parti che ha già risolto, almeno in parte, alcuni di questi problemi, in particolare quello per iniziare a modificare con una chiave ragionevole? Non mi piacerebbe fare tutto il noioso filtraggio me stesso.

Qualsiasi aiuto sarebbe apprezzato. Grazie.

Marcos

UPDATE

Per il momento sto usando questa "soluzione" altamente imperfetto, che almeno rende le cose meno peggio per il momento. Miglioramenti, commenti e suggerimenti sono apprezzati.

@Override 
    public boolean isCellEditable(EventObject e) 
    { 
     if (e instanceof MouseEvent) 
     { 
      return ((MouseEvent) e).getClickCount() >= 
       _delegate.getMouseClickCountToStartEditing(); 
     } 
     else if (e instanceof KeyEvent) 
     { 
      KeyEvent event = (KeyEvent) e; 

      int key = event.getKeyCode(); 
      if ((key >= KeyEvent.VK_F1 && key <= KeyEvent.VK_F12) && 
       KeyStroke.getKeyStrokeForEvent(event) != _startEditingKey) 
      { 
       return false; 
      } 

      int ctrlAlt = KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK; 
      if ((event.getModifiersEx() & ctrlAlt) == ctrlAlt) 
      { 
       return true; 
      } 

      if ((event.getModifiersEx() & ctrlAlt) != 0) 
      { 
       return false; 
      } 

      return true; 
     } 
     else 
     { 
      // Is this else really needed? Are there other events types 
      // other than mouse and key events? 
      return true; 
     } 
    } 

    // _startEditingKey is obtained with this method 
    private KeyStroke getStartEditingKey() 
    { 
     InputMap bindings = TheTable.this.getInputMap(
      JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
     for (KeyStroke key : bindings.allKeys()) 
     { 
      Object binding = bindings.get(key); 
      if ("startEditing".equals(binding)) 
      { 
       return KeyStroke.getKeyStroke(
        key.getKeyCode(), key.getModifiers(), true); 
      } 
     } 
     return null; 
    } 
+0

Modifica la tua domanda per includere [sscce] (http://sscce.org/) che mostra il problema specifico che stai riscontrando. – trashgod

+0

Siamo spiacenti. Penso che una sscce sia inutile in questo caso. Il problema è già ben descritto dal mio testo. – Marcos

risposta

1

È possibile associare qualsiasi tasto desiderato per startEditing l'azione del tavolo, come mostrato here e here. È possibile disabilitare le chiavi indesiderate, come mostrato here. Alcune sfumature aggiuntive sono mostrate here e l'articolo citato here da @camickr.

+0

Il problema, come ho detto, è che l'elenco di chiavi indesiderate da disabilitare è enorme. Sto pensando di creare un falso JTextField invisibile riempito con 5 caratteri e inviare l'evento chiave nel metodo _editCellAt_ (overriden) ad esso. Se il testo del campo falso cambia, è una chiave valida e modificabile. Se non cambia, non è una chiave valida, quindi restituisco _false_ dal metodo _editCellAt_. Cosa ne pensi? – Marcos

+0

@Marcos che cosa non va con F2 implementato in JTable API, altrimenti per cambiare quello – mKorbel

+0

@mKorbel Non mi sto lamentando del tasto F2. Mi sto solo lamentando delle altre chiavi. Il tasto F2 continuerà a essere autorizzato a iniziare la modifica. – Marcos

4

è possibile implementare un editor personalizzato che riporta di non essere modificabile se il KeyEvent ha modificatori che si desidera ignorare:

DefaultCellEditor editor = new DefaultCellEditor(new JTextField()) { 

    @Override 
    public boolean isCellEditable(EventObject e) { 
     if (e instanceof KeyEvent) { 
      return startWithKeyEvent((KeyEvent) e); 
     } 
     return super.isCellEditable(e); 
    } 

    private boolean startWithKeyEvent(KeyEvent e) { 
     // check modifiers as needed, this here is just a quick example ;-) 
     if ((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { 
      return false; 
     }  
     // check for a list of function key strokes 
     if (excludes.contains(KeyStroke.getKeyStrokeForEvent(e)) { 
      return false; 
     } 
     return true; 
    } 

}; 
JTable table = new JTable(new AncientSwingTeam()); 
table.setDefaultEditor(Object.class, editor); 

Edit: per un filtraggio più affidabile in grado di gestire correttamente le combinazioni CTRL-ALT, potresti dare un'occhiata a DefaultEditorKit.DefaultKeyTypedAction: delegando sostanzialmente a un metodo nascosto in SunToolkit e gestendo keyTyped (vs keyPressed necessario per filtrare gli eventi che sono probabili candidati per un carattere stampabile valido dopo aver avviato la modifica) potrebbe ancora darti un'idea di come farlo (la fonte del suntoolkit è probabilmente disponibile in openjdk, non è stata cercata prima, però)

+0

Fortunatamente uso editor di celle personalizzate per tutte le colonne della mia tabella. Ma penso di non aver bisogno di ricorrere a loro per risolvere questo problema. Penso di poter fare meglio con il metodo _editCellAt_ sovrascritto (ricorda che posso anche accedere all'evento _KeyEvent_). Ma il controllo per vedere quali combinazioni di tasti potrebbero passare è soggetto a errori da parte di un programmatore. Questo è quello che sto cercando di evitare. Vedi la mia risposta a @trashgod qui sotto. Proverò quell'alternativa e vedrò se funziona. Grazie per la risposta. – Marcos

+0

beh, l'editor api è _designed_ per decidere se un evento arbitrario dovrebbe iniziare o meno la modifica: quindi è sicuramente il posto giusto per farlo (* non * nella tabella, editCellAt deve solo interrogare l'editor) E no, non lo faccio Si vede molto un problema riguardante le combinazioni di tasti: dovrete controllare i modificatori che non dovrebbero attivare nulla più un set di tasti funzione che sono facili da passare nell'editor come una lista di keyStrokes che possono essere controllati con – kleopatra

+0

Ok, I d'accordo hai ragione riguardo l'editor api. Il mio codice può anche essere lì senza alcun problema. Ma con le combinazioni di tasti non è così facile come questo. Ad esempio, nella mia tastiera, se digito Ctrl + Alt + a otterrò un carattere 'á'. Quindi il problema non è solo quello di filtrare alcune combinazioni di tasti di controllo. Devo sapere quale produrrebbe un personaggio valido. Questo problema è difficile e non vedo alcun modo semplice per sbarazzarsene. – Marcos

Problemi correlati