PDA

View Full Version : [Java] Swing: menu contestuale con tasto destro su JTable


rayman2
14-03-2007, 09:58
Ciao a tutti,
sto facendo una micro applicazione Java basata su swing (come accennato anche in un post precedente).
La finestra principale ha un JMenu e subito sotto una JTable.
Quello che vorrei ottenere è che cliccando col tasto destro su di una riga della tabella venga selezionata la riga e mostrato un menu contestuale per compiere delle azioni riguardanti quella riga di tabella (inserimento, cancellazione, refresh, apertura nel browser del link associato).
Ho creato un JPopupMenu e associato alla JTable un listener dell'evento MouseEvent che rende visibile il JPopupMenu. Ecco degli stralci del codice:


table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
tableMouseReleased(evt);
}
});


private void tableMouseReleased(java.awt.event.MouseEvent evt) {
rightClickMenu.setLocation(evt.getX() + this.getX() + 20, evt.getY() + this.getY() + 70);
rightClickMenu.setVisible(true);
}


Come potrete notare i problemi che ho sono principalmente due: il menu appare sia cliccando col tasto destro che con quello sinistro, inoltre cliccando col destro non seleziona la riga; il secondo è che il menu non appare esattamente nel punto in cui si trova il mouse in quel momento.
Per il primo problema non so proprio come cavarmela: si può evolvere la mia idea o devo pensare a qualcosa di diverso?
Per il secondo come vedete ho pensato di posizionare il menu in base alla somma di coordinate dei singoli componenti ma anche così non si posizionava dove volevo io. Ho quindi dovuto aggiungere dei valori, 20 e 70, per aggiustare ad hoc la posizione. Ho forse dimenticato nel conteggio qualche componente o "va bene così"? Il dubbio è che i valori trovati empiricamente sul mio PC possano sballare in altre configurazioni della finestra.

Grazie dell'aiuto!

PGI-Bis
14-03-2007, 10:07
JPopupMenu ha un metodo, show, che richiede come primo argomento il componente che genera l'evento del mouse e come secondo e terzo le coordinate (x, y) del punto in cui si è fatto click. Del genere:

Component source = mouseEvent.getComponent();
popup.show(source, e.getX(), e.getY());

Per selezionare la riga sulla tabella è sufficiente trasformare il punto di pressione in un indice di riga. Se guardi nella documentazione di JTable c'è un esempio già pronto che tratta di questa trasformazione.

Per controllare quale pulsante è stato premuto e poi decidere se attivare o meno il popup il modo più sintetico è usare SwingUtilities. Ad esempio:

if(SwingUtilities.isRightMouseButton(mouseEvent)) {
//pulsante destro
}

Più in generale, la questione pulsante destro/sinistro è documentata in InputEvent.getModifiersEx()

rayman2
14-03-2007, 10:42
Tutto perfetto, grazie mille!

lovaz
14-03-2007, 10:49
Oppure:

@Override public void mousePressed(MouseEvent e)
{
if( e.isPopupTrigger() )
{ ... }