2010-11-08 20 views
6

Ho una tabella J e un menu popup specifico per ogni riga. Voglio calcolare la riga su cui l'utente ha fatto clic con il pulsante destro del mouse (Windows L & F) per visualizzare il menu popup.Trova la riga JTable su cui è stato richiamato un menu popup

Creo un MouseListener per la tabella, quindi ottiene MouseEvent al clic e mostra il menu popup nella posizione corretta. Ma quando l'utente seleziona un elemento dal menu popup, non riesco a capire un modo per determinare quale sia la riga in cui l'utente ha fatto clic con il pulsante destro del mouse. L'evento per il richiamo del menu a comparsa non ha le coordinate x, y in cui si è verificato il clic con il tasto destro del mouse.

Ho cercato di ottenere la posizione del popup, ma questo appartiene al frame, non alla tabella, quindi né lui né i suoi genitori hanno i valori x, y corretti per quello che voglio.

Ho lavorato attorno a sottoclassi di JPopupMenu e impostando i valori x e y che voglio avere in MouseListener. Ma mi sembra che questo sarebbe un problema generale per chiunque voglia mettere un menu popup su una tabella, e mi chiedo cosa mi sia perso.

Esiste un modo più semplice per eseguire questa operazione, in particolare uno che non prevede la sottoclasse di JPopupMenu?

+0

possibile duplicato di [Java Swing JTable; Menu del tasto destro (Come faccio a "selezionare" o evidenziare la riga)] (http://stackoverflow.com/questions/3558293/java-swing-jtable-right-click-menu-how-do-i- get-it-to-select-aka-highlight-t) –

risposta

14
JTable.rowAtPoint(...); 

È possibile ottenere il punto da MouseEvent.

Edit:

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

Bene, parte del problema è che non c'è MouseEvent nel posto nel codice in cui voglio queste informazioni. MouseEvent è stato utilizzato per mostrare il menu popup nel posto giusto; l'evento appena accaduto è un ActionEvent, generato quando l'utente sceglie un'opzione di menu. Quindi non c'è X, Y connessa con l'evento. Posso salvare MouseEvent (o X, Y) e passarlo al mio evento in vari modi, ma stavo cercando un modo "più pulito". – user492820

+1

@ user492820, il problema è che il tuo codice è strutturato in modo errato. Il "modo più pulito" è selezionare la riga QUANDO viene visualizzato il popup. Vedere la mia modifica per il codice generale per farlo. – camickr

2

Se non ti dispiace selezionando la riga sul tasto destro del mouse, poi nel MouseListener utilizzare JTable.rowAtPoint() e selezionare la riga se non è selezionata, e poi in chi ascolta pop-up utilizzare JTable.getSelectedRows() per elaborare le tue righe. Oppure puoi salvarli in una struttura dati separata a cui puoi accedere dal listener del menu popup.

+0

No, non voglio selezionarlo; Penso che sia un comportamento non standard, almeno su una scatola di Windows. Speravo in un modo per scoprirlo senza quello. – user492820

+0

credo sia un comportamento standard per selezionare una cella o una riga su cui è stato eseguito il clic destro. Se non si desidera selezionare la riga, salvare il numero di riga in alcuni parametri accessibili dal listener del menu. –

+0

Beh, fatti poco noti su sistemi operativi apparentemente ben noti. Non uso mai il tasto destro del mouse per selezionare qualcosa, e sono riuscito a dimenticare che lo ha fatto. Grazie, lo userò (e camickr ha mostrato il codice nel commento qui sotto. Grazie a tutti. – user492820

Problemi correlati