2009-08-12 12 views
5

Estoy tratando de agregar una columna a una JTable con el comportamiento siguiente (similar al Explorador de Windows y conchas similares):Hacer una célula JTable editable - pero * no * es haciendo doble clic en

  • La célula puede ser clickeado una vez para seleccionarlo, como de costumbre.
  • Se puede hacer doble clic en la celda para realizar una acción por separado (iniciando un programa externo)
  • El valor de celda (una cadena) aún se puede editar haciendo un solo clic por segunda vez (después de una pausa) o presionando F2 cuando la celda está resaltada.

Al hacer doble clic debe no edición de gatillo de la célula, pero me gustaría salir de cualquier otro tipo de edición predeterminado desencadena operativa si es posible.

He intentado añadir un MouseListener a la mesa, y el consumo de todas las MouseEvent s, pero esto no funciona - si vuelvo true de isCellEditable() entonces mi oyente no recibe ningún eventos de clic, pero si vuelvo false continuación F2 sin más tiempo funciona.

¿Se puede lograr esto utilizando solo detectores de eventos? Preferiría no meterme con las funciones PLAF si puedo evitarlo.

+0

[Aquí] (http://stackoverflow.com/a/25919008/738017) hay una respuesta más reciente de [camickr] (http://stackoverflow.com/users/131872/camickr) que resuelven el problema en 4 líneas de código. –

Respuesta

3

Usted tendrá que hacer su propia cellEditor y ovveride

public boolean isCellEditable(EventObject e) 

se pueden diferenciar de simple y doble clic en el clickCount en el eventObject

Si es un solo clic y está en una posición seleccionada celda puede devolver verdadero; de lo contrario, devolver falso;

recuperar fila y columna con

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

para permitir F2 puede agregar a medida inputMap en actionMap entradas

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

y de su acción a continuación, puede disparar el cellediting mismo

table.editCellAt(row, column); 
+0

Esto es similar a lo que hice con el proxy. Solo anulo isCellEditable. El controlador de trazo clave está incluido en el editor predeterminado. No necesito volver a implementar eso. – finnw

4

DefaultCellEditor tiene un método setClickCountToStart() para controlar los clics del mouse para su edición. El valor predeterminado es 2. Cambiar esto no tendrá ningún efecto en la funcionalidad F2.

Por lo tanto, puede configurar la edición con un triple clic.

No estoy seguro exactamente cómo manejar dos clics individuales para comenzar la edición, pero supongo que usaría un temporizador para realizar un seguimiento del primer clic y luego editar si el segundo clic solo está dentro de su intervalo de tiempo.

+0

No es necesario un temporizador; solo necesita ser demasiado lento para registrarse con un doble clic. – finnw

1

que han resuelto este envolviendo la CellEditor existente con un Proxy e interceptar llamadas a isCellEditable, volviendo falsa para todos los eventos de ratón y delegar el resto de llamadas a la original CellEditor.

Esto es un poco más complejo que la solución de Camickr pero funciona para todos los editores (tengo 4 en total.)

+0

Estaría interesado en ver la solución. Además, no entiendo cómo distinguir entre el clic inicial en la celda y el clic para iniciar la edición. ¿Tu código solo rastrea la última celda que se seleccionó y cuando obtienes dos clics individuales en la misma celda, comienzas a editar? Si es así, el segundo clic podría ser el segundo o minutos más tarde. Su requerimiento inicial dijo después de una "pausa", por lo que sugerí un temporizador para controlar el intervalo de pausa. – camickr

+0

@carnickr, todavía no he implementado esa parte, pero sí que suena bien. No hay límite de tiempo. – finnw

Cuestiones relacionadas