Hacer una célula JTable editable - pero * no * es haciendo doble clic
-
13-09-2019 - |
Pregunta
Estoy tratando de agregar una columna a una JTable
con el comportamiento siguiente (similar al Explorador de Windows y conchas similares):
- La célula se puede hacer clic una vez para seleccionarlo y, como de costumbre.
- La célula puede ser doble clic para realizar una acción separada (lanzamiento de un programa externo.)
- El valor de la celda (una cadena) todavía se pueden editar, por un solo clic en un segundo tiempo (después de una pausa) o pulsando F2 cuando se pone de relieve la célula.
Al hacer doble clic debe no Edición de disparo de la celda, 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
entonces F2 ya no funciona.
Se puede lograr esto usando sólo los detectores de eventos? Yo preferiría que no se meta con las funciones plaf si puedo evitarlo.
Solución
Usted tendrá que hacer su propia cellEditor y ovveride
public boolean isCellEditable( EventObject e )
Puede distinguir entre sencillo y doble clic en el clickCount en el eventObject
Si es un solo clic y está en una celda seleccionada puede volver cierto lo contrario return false;
recuperar fila y columna con
int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());
para habilitar 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 mismo cellediting
table.editCellAt(row, column );
Otros consejos
El DefaultCellEditor tiene un método setClickCountToStart () para controlar los clics del ratón para la edición. El valor predeterminado es 2. Cambiar esto no tendrá ningún efecto en la funcionalidad F2.
Por lo tanto se puede establecer de edición para ser un triple clic.
No estoy seguro exactamente cómo manejar dos clics individuales para empezar a editar pero supongo que sería utilizar un temporizador para realizar un seguimiento de la primera posición y luego hacer la edición si el segundo solo clic está dentro de ti intervalo de tiempo.
Me han resuelto este envolviendo la CellEditor
existente con un Proxy
e interceptar las llamadas a isCellEditable
, volviendo falsa para todos los eventos de ratón y delegar el resto de llamadas a la CellEditor
originales.
Esto es un poco más compleja que la solución de camickr pero funciona para todos los editores (tengo 4 en total).