PDA

View Full Version : Java - Per sapere da dove proviene un evento


Lakaj
08-02-2007, 07:53
Ciao a tutti,
ho un dubbio in merito alla classe ActionEvent della quale ho visto i metodi nel javadoc...
Come è possibile sapere da quale pulsante proviene un click, se ho due pulsanti che si chiamano allo stesso modo ? E' possibile disambiguare e sapere da quale JPanel proviene ?
Ho visto anche la classe MouseAdapter e MouseEvent non contiene nulla a riguardo...
Cioè spero che la differenziazione non debba farla tramite le coordinate del click, troppo squallido...

andbin
08-02-2007, 08:33
Ciao a tutti,
ho un dubbio in merito alla classe ActionEvent della quale ho visto i metodi nel javadoc...
Come è possibile sapere da quale pulsante proviene un click, se ho due pulsanti che si chiamano allo stesso modo ?Con il metodo getSource()
private JButton btn1;
private JButton btn2;

...
...

void actionPerformed (ActionEvent e) {
Object src = e.getSource ();

if (src == btn1) {
.....
} else if (src == btn2) {
.....
}
}
E' possibile disambiguare e sapere da quale JPanel proviene ?Cioè tu ad esempio hai 2 JPanel e in ognuno hai un pulsante, a seguito dell'evento generato da un pulsante vuoi sapere da quale JPanel??
Se è così, usa getParent() per sapere quale è il contenitore che contiene il pulsante.

Ho visto anche la classe MouseAdapter e MouseEvent non contiene nulla a riguardo...
Cioè spero che la differenziazione non debba farla tramite le coordinate del click, troppo squallido...Le classi XXXAdapter sono semplicemente delle implementazioni "vuote" delle rispettive interfacce XXXListener. Se invece di implementare un XXXListener estendi da un XXXAdapter, devi fare l'override solo dei metodi che realmente ti servono e non di tutti.

franksisca
08-02-2007, 08:55
oppure, se vuoi, puoi implementare l'azione del pulsante direttamente, in poche parole una cosa del genere:


private JButton pulsante=new JButton("TESTO");
pulsante.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//FAI LE OPERAZIONI CHE DEVE FARE IL PULSANTE
}


magari stilisticamente non è bellissima, ma molto comoda se il pulsante deve fare poco;)

Lakaj
08-02-2007, 09:19
Con il metodo getSource()
private JButton btn1;
private JButton btn2;

...
...

void actionPerformed (ActionEvent e) {
Object src = e.getSource ();

if (src == btn1) {
.....
} else if (src == btn2) {
.....
}
}
Cioè tu ad esempio hai 2 JPanel e in ognuno hai un pulsante, a seguito dell'evento generato da un pulsante vuoi sapere da quale JPanel??
Se è così, usa getParent() per sapere quale è il contenitore che contiene il pulsante.

Le classi XXXAdapter sono semplicemente delle implementazioni "vuote" delle rispettive interfacce XXXListener. Se invece di implementare un XXXListener estendi da un XXXAdapter, devi fare l'override solo dei metodi che realmente ti servono e non di tutti.
Ah, giusto, che stupido sono...
Forse pero' ho un problema, poichè io ho una classe
public class Interf1 extends JFrame {
...
}
e quei btn1 e btn2 di cui parli tu sono la dentro e non sono visibili all'altra classe Evento che mi implementa ActionListener, nemmeno se li dichiaro 'protected' ,poichè il protected è riferito al package JFrame e non al mio... :cry:
Cioè in teoria la soluzione potrebbe essere passare tutti i 15 JButton al costruttore della classe Evento :D però il professore mi boccia...
Oppure costruire una classe involucro alla classe Interf1 in cui dichiarare tutto protected ... :cry:
Grazie franksiska, ma non mi piace allocare classi al 'volo' cioè anonime o come si chiamano...mhh..non lo so (devo studiare :cry: ) con le new , ma mi piace avere tutto schematizzato... cmq grazie..

Lakaj
08-02-2007, 09:22
oppure, se vuoi, puoi implementare l'azione del pulsante direttamente, in poche parole una cosa del genere:


private JButton pulsante=new JButton("TESTO");
pulsante.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//FAI LE OPERAZIONI CHE DEVE FARE IL PULSANTE
}


magari stilisticamente non è bellissima, ma molto comoda se il pulsante deve fare poco;)
No, purtroppo i miei pulsanti devono riempire un paio di HashTable e Vector :D

franksisca
08-02-2007, 09:26
Grazie franksiska, ma non mi piace allocare classi al 'volo' cioè anonime o come si chiamano...mhh..non lo so (devo studiare :cry: ) con le new , ma mi piace avere tutto schematizzato... cmq grazie..
figurati, dovere;)

andbin
08-02-2007, 09:58
Ah, giusto, che stupido sono...
Forse pero' ho un problema, poichè io ho una classe
public class Interf1 extends JFrame {
...
}
e quei btn1 e btn2 di cui parli tu sono la dentro e non sono visibili all'altra classe Evento che mi implementa ActionListener, nemmeno se li dichiaro 'protected' ,poichè il protected è riferito al package JFrame e non al mio... :cry: Se Interf1 e Evento fanno parte dello stesso package, potresti dichiarare i componenti in Interf1 in modo che abbiano livello di accesso di 'default' che indica accesso a livello di package.

public class Interf1 extends JFrame {
JButton btn1;
JButton btn2;
....Senza mettere alcun modificatore di accesso specifico (public/protected/private), la variabile di istanza è visibile da tutte le classi nello stesso package (ovviamente devi avere un reference ad una istanza di Interf1 per poterci accedere).