Domanda

Sto cercando di aggiungere una colonna a una JTable con il seguente comportamento (simile a Windows Explorer e conchiglie simili):

  • La cella può essere cliccato una volta per selezionarlo, come al solito.
  • Il cellulare può essere fatto doppio clic per eseguire un'azione separata (il lancio di un programma esterno.)
  • Il valore della cella (una stringa) può ancora essere modificato, per singoli clic una seconda volta (dopo una pausa) o premendo F2 quando è evidenziata la cella.

Un doppio clic deve non modifica grilletto della cella, ma vorrei lasciare qualsiasi altra modifica delle impostazioni predefinite innesca operativa, se possibile.

Ho provato ad aggiungere un MouseListener al tavolo, e consumare tutti MouseEvents, ma questo non funziona - se torno true da isCellEditable() allora il mio ascoltatore non riceve alcun evento click, ma se torno false poi F2 non funziona più.

Può questo essere raggiunto utilizzando solo listener di eventi? Preferirei non fare confusione con le funzioni PLAF se posso evitarlo.

È stato utile?

Soluzione

Si dovrà fare il proprio cellEditor e ovveride

public boolean isCellEditable( EventObject e )

È possibile distinguere tra singolo e doppio click con il clickCount sul eventObject

Se la sua un solo clic e la sua su una cella selezionata è possibile restituire true in caso contrario return false;

recuperare la riga e la colonna con

int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());

per consentire F2 è possibile aggiungere personalizzato inputMap en actionMap iscrizioni

similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction()); 

e dalla vostra azione è quindi possibile sparare il cellediting te

table.editCellAt(row, column );

Altri suggerimenti

Il DefaultCellEditor ha un metodo setClickCountToStart () per controllare clic del mouse per l'editing. Il valore predefinito è 2. Cambiare questo non avrà alcun effetto sulla funzionalità F2.

Quindi si può impostare la modifica di essere una tripla clic.

Non sono sicuro esattamente come gestire due scatti singoli per iniziare a modificare, ma immagino che si sarebbe utilizzare un timer per tenere traccia del primo clic e poi fare l'editing se il secondo singolo clic è dentro di voi intervallo di tempo.

Ho risolto questo avvolgendo il CellEditor esistente con un Proxy e intercettare le chiamate a isCellEditable, tornando false per tutti gli eventi del mouse e delegando tutte le altre chiamate al CellEditor originale.

Questo è un po 'più complessa di quanto la soluzione di camickr ma funziona per tutti gli editor (ho 4 in tutto).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top