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 MouseEvents, 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.

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top