2010-11-08 47 views
6

Tengo una JTable y un menú emergente que es específico de cada fila. Quiero calcular la fila en la que el usuario hizo clic con el botón derecho del mouse (Windows L & F) para que aparezca el menú emergente.Encontrar la fila JTable en la que se ha invocado un menú emergente

Creo un MouseListener para la tabla, por lo que obtiene el MouseEvent con un clic, y muestra el menú emergente en el lugar correcto. Pero cuando el usuario selecciona un elemento del menú emergente, no puedo encontrar la forma de determinar en qué fila estaba el usuario al hacer clic derecho en primer lugar. El evento para la invocación del menú emergente no tiene las coordenadas x, y donde el clic derecho tuvo lugar más.

He tratado de obtener la posición de la ventana emergente, pero eso pertenece al marco, no a la tabla, por lo que ni ella ni su padre tienen los valores x, y correctos para lo que deseo.

He trabajado al respecto subclasificando JPopupMenu y estableciendo los valores xey que quiero que tengan en el MouseListener. Pero me parece que esto sería un problema general para cualquiera que quiera poner un menú emergente en una JTable, y me pregunto qué me he perdido.

¿Hay una forma más sencilla de hacerlo, especialmente una que no implique la subclasificación de JPopupMenu?

+0

posible duplicado de [Java Swing JTable; Haga clic derecho en el menú (¿Cómo puedo obtenerlo para "seleccionar" también conocido como resaltar la fila)] (http://stackoverflow.com/questions/3558293/java-swing-jtable-right-click-menu-how-do-i- get-it-to-select-aka-highlight-t) –

Respuesta

14
JTable.rowAtPoint(...); 

Puede obtener el punto de MouseEvent.

Editar:

table.addMouseListener(new MouseAdapter() 
{ 
    public void mouseReleased(MouseEvent e) 
    { 
     if (e.isPopupTrigger()) 
     { 
      JTable source = (JTable)e.getSource(); 
      int row = source.rowAtPoint(e.getPoint()); 
      int column = source.columnAtPoint(e.getPoint()); 

      if (! source.isRowSelected(row)) 
       source.changeSelection(row, column, false, false); 

      popup.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
}); 
+0

Bueno, parte del problema es que no hay MouseEvent en el lugar en el código donde quiero esta información. El MouseEvent se consumió para mostrar el menú emergente en el lugar correcto; el evento que acaba de suceder es un ActionEvent, generado cuando el usuario elige una opción de menú. Entonces, no hay X ni Y conectados con el evento. Puedo guardar el MouseEvent (o la X, Y) y pasarlo a mi evento de varias maneras, pero estaba buscando una manera 'más limpia'. – user492820

+1

@ user492820, el problema es que su código está mal estructurado. La "manera más limpia" es seleccionar la fila CUANDO se muestra la ventana emergente. Ver mi edición para el código general para hacer esto. – camickr

2

Si no te importa la selección de su fila en el botón derecho del ratón, a continuación, en el MouseListener utilizar JTable.rowAtPoint() y seleccionar la fila si no está seleccionado, y luego en el oyente emergente usar JTable.getSelectedRows() para procesar tus filas O puede guardarlos en una estructura de datos separada a la que puede acceder desde el oyente de su menú emergente.

+0

No, no quiero seleccionarlo; Creo que es un comportamiento no estándar, al menos en una caja de Windows. Esperaba encontrar una manera de averiguarlo sin eso. – user492820

+0

Creo que es un comportamiento estándar para seleccionar una celda o una fila en la que se realizó el clic derecho. Si no desea seleccionar la fila, guarde el número de fila en algún parámetro accesible desde su escucha de menú. –

+0

Bueno, hechos poco conocidos sobre sistemas operativos supuestamente bien conocidos. Nunca utilizo el botón derecho para seleccionar algo, y logré olvidar que así fue. Gracias, lo usaré (y camickr ha mostrado el código en el comentario a continuación. Gracias a todos. – user492820

Cuestiones relacionadas