PDA

View Full Version : [Java] Jtable ed eventi


palombaro
02-08-2004, 21:50
Buona sera ho un piccolo problema relativo agli eventi in java..
vorrei che facendo un doppio clik su una riga di uan jtable mi si aprisse una finestrella...non riesco a farlo qualcuno può aiutarmi grazie!!!

palombaro
03-08-2004, 19:50
uppete...

kingv
03-08-2004, 19:59
Originariamente inviato da palombaro
uppete...



purtroppo i due uomini swing sono in ferie :boh:

palombaro
03-08-2004, 20:08
Originariamente inviato da kingv
purtroppo i due uomini swing sono in ferie :boh:

attenderò :)

anx721
04-08-2004, 01:35
Originariamente inviato da kingv
purtroppo i due uomini swing sono in ferie :boh:

Allora mi propongo come Uomo Swing di scorta ! :D

Io farei cosi:

JTable eredita da Component il metodo addMouseListener, quindi è in grado di produrre gli eventi del mouse e basta aggiungere un MouseListener alla JTable per ricevere gli eventi prodotti. In particolare l'evento prodotto dalla JTable è un MouseEvent.

Una volta ottenuto l'evento bisogna verificare se:

- si tratta di un doppio click;

- se il doppio click è avventuo sulla riga che ti interessa.


Per sapere se si tratta di un doppio click c'è il metodo getClickCount() di MouseEvent;

Per sapere qual è la riga interessata dal click dapprima ricaviamo dal MouseEvent il punto in cui è avvenuto il click con getPoint(); quindi invochiamo sulla JTable il metodo rowAtPoint(Point point) che restituisce l'indice della riga in cui si trova il punto, o -1 se quel punto non si trova in nessuan riga. Controllando questo valore puoi decidere se far aprire o non un nuovo JFrame.


Quindi il tuo listener potrebbe essere su per giù cosi:


class DoubleClickListener exteds MouseAdapter{

//Questo campo contiene l'indice della riga su cui si
//deve fare doppio click per aprire la finestra;
//puoi anche passarlo nel costruttore o gestirlo in altro modo
private int clickRow = 0;


//A noi interessa solo l'evento di click
public void mouseClicked(MouseEvent e){
//se non è doppio click ritorno
if(e.getClickCount() < 2)
return;
//Considero solo i click del pulsante sinistro;
//se vuoi gestire l'evento anche se si fa dopppio
//click col tasto destro commenta questo if
if(e.getButton() != MouseEvent.BUTTON1)
return;
//Ricavo la tabella che ha prodotto l'evento
JTable table = (JTable)e.getSource();
//Calcolo la riga su cui si è fatto click
int clickedRow = rowAtPoint(e.getPoint());
//Se non è la riga che mi interessa ritorno
if(clickedRow != clickRow)
return;
//Altrimenti costruisco la nuova finestra
//.....
//......
//.....
}

}



Quindi quando crei la tabella devi registrare il listener:

JTable table = .....;
table.addMouseListener(new DoubleClickListener());

Dovrebbe fungere, anche se non l'ho provato, ciao!

palombaro
04-08-2004, 11:45
grazie ora lo provo.....:)
ti farò sapere ;)

palombaro
04-08-2004, 12:30
Originariamente inviato da anx721
Allora mi propongo come Uomo Swing di scorta ! :D

Io farei cosi:

JTable eredita da Component il metodo addMouseListener, quindi è in grado di produrre gli eventi del mouse e basta aggiungere un MouseListener alla JTable per ricevere gli eventi prodotti. In particolare l'evento prodotto dalla JTable è un MouseEvent.

Una volta ottenuto l'evento bisogna verificare se:

- si tratta di un doppio click;

- se il doppio click è avventuo sulla riga che ti interessa.


Per sapere se si tratta di un doppio click c'è il metodo getClickCount() di MouseEvent;

Per sapere qual è la riga interessata dal click dapprima ricaviamo dal MouseEvent il punto in cui è avvenuto il click con getPoint(); quindi invochiamo sulla JTable il metodo rowAtPoint(Point point) che restituisce l'indice della riga in cui si trova il punto, o -1 se quel punto non si trova in nessuan riga. Controllando questo valore puoi decidere se far aprire o non un nuovo JFrame.


Quindi il tuo listener potrebbe essere su per giù cosi:


class DoubleClickListener exteds MouseAdapter{

//Questo campo contiene l'indice della riga su cui si
//deve fare doppio click per aprire la finestra;
//puoi anche passarlo nel costruttore o gestirlo in altro modo
private int clickRow = 0;


//A noi interessa solo l'evento di click
public void mouseClicked(MouseEvent e){
//se non è doppio click ritorno
if(e.getClickCount() < 2)
return;
//Considero solo i click del pulsante sinistro;
//se vuoi gestire l'evento anche se si fa dopppio
//click col tasto destro commenta questo if
if(e.getButton() != MouseEvent.BUTTON1)
return;
//Ricavo la tabella che ha prodotto l'evento
JTable table = (JTable)e.getSource();
//Calcolo la riga su cui si è fatto click
int clickedRow = rowAtPoint(table.getPoint());
//Se non è la riga che mi interessa ritorno
if(clickedRow != clickRow)
return;
//Altrimenti costruisco la nuova finestra
//.....
//......
//.....
}

}



Quindi quando crei la tabella devi registrare il listener:

JTable table = .....;
table.addMouseListener(new DoubleClickListener());

Dovrebbe fungere, anche se non l'ho provato, ciao!


ti ringrazio funziona perfettamnte nel tuo codice c' è un errorino d distrazione in questa riga
int clickedRow = rowAtPoint(table.getPoint());
in realtà è così
int clickedRow = table.rowAtPoint(e.getPoint());
:)
ancora tante grazie!!!!!!

anx721
04-08-2004, 13:10
Si certo, in effetti non l'ho proprio provato ;)