Oppure

Loading
06/08/13 16:20
Lagaslen
Ciao! In questo periodo mi sto cimentando con le GUI in java, ma non ho ben capito come funzionano i listener e i relativi metodi, chiedo gentilmente a chi ne sa piu di me(mi sa tutti qui :asd: ) se potreste spiegarmi in modo semplice oppure linkarmi qualche guida italiano o inglese :)
aaa
07/08/13 10:40
Guglielmoqwerty
Allora, come guida ti coniglio questa: skenz.it/traduttori/risorse/… (solo la parte AWT-SWING-APPLET, da pag 412)

Il succo di tutto è passare all'oggetto in questione un oggetto di una classe che implementi action listener (l'interfaccia che gestisce gli eventi)

Esempio preso dal libro:
[CODE]
import java.awt.*; //Uso AWT, ma il concetto è lo stesso!

public class TrueDelegationModel
{
private Frame f;
private Button b;
private Label l;

public TrueDelegationModel()
{
f = new Frame("Delegation Model";);
b = new Button("Press Me";);
l = new Label();
}

public void setup()
{
b.addActionListener(new TrueButtonHandler(l)); //Devo passare come parametro un oggetto di una classe che implementi ActionListener

f.add(b,BorderLayout.CENTER);
f.add(l,BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
}

public static void main(String args[])
{
TrueDelegationModel delegationModel = new TrueDelegationModel();
delegationModel.setup();
}
}
[/CODE]

[CODE]
import java.awt.event.*; //Package in cui è presente l'interfaccia ActionListener
import java.awt.*;

public class TrueButtonHandler implements ActionListener //implemento la famosa interfaccia
{
private Label l;
private int counter;

public TrueButtonHandler(Label l)
{
this.l = l; //Passo il reference del label per poterlo modificare da questo oggetto
}

/*
Il cuore di tuttto. Quando tu clicchi sul bottone (o qualunque altra cosa a cui hai passato un oggetto di questa classe) viene eseguito chiamato questo metodo.
*/
public void actionPerformed(ActionEvent e)
{
l.setText(e.getActionCommand() + " - " + (++counter));
}
}
[/CODE]

In poche parole tu passi al metodo "addActionListener()" un oggetto di una classe che implementa actionListener e quando tu schiacci il pulsante viene eseguito il codice di "actionPerformed()". Il ragionamento è analogo per tutto, cambia solo l'interfaccia implementata e i metodi.


Spero di essere stato chiaro. Per qualsiasi dubbio chiedimi pure. (Grazie per la domanda, mi sono accorto che in realtà questo tipo di codice lo avevo imparato a memoria senza ragionarci sopra, cosa che ho dovuto fare per risponderti :D)
aaa
07/08/13 12:17
Lagaslen
Grazie mille per la risposta e per la chiarezza, completezza e disponibilta! Finalmente sono riuscito a capire un po e ho realizzato un invertitore di frasi-parole :) ultima domandina:

Supponiamo che nella classe Finestra ho un metodo dove istanzio 2 bottoni su un JPanel, io quindi dovro creare 2 classi per esempio b1_Listener e b2_Listener che implementano ActionListener con i relativi metodi per gestire i 2 pulsanti separatamente e istanziare l'oggetto b1_l per il b1 e un oggetto b2_l per il b2 Giusto?:)

PS. Scusa per il casino :rotfl:
Ultima modifica effettuata da Lagaslen 07/08/13 12:23
aaa
07/08/13 12:42
Guglielmoqwerty
casino? Tu non sai cosa combinavo io all'inizio, andavo avanti per costruttori XD

La risposta é...bhe, dipende. Se il codice da eseguire sui due bottoni é lo stesso puoi passare due oggetti o addirittura lo stesso oggetto (immagazzinato in una variabile in precedenza), se é diverso la cosa migliore sono due classi diverse.

Se però la classe la crei per utilizzarla una sola volta valuta di creare una classe anonimo, una classe chi si istanziauna sola volta quando viene scritta:

//Codice
oggettoButtone.addActionListener(new ActionListener() //Creo una classe che implementa ActionListener. Nota l'assenza del nome
{ //apro la classe e scrivo normalmente
public void actionPerformed(ActioneEvent e )
{
//codice
}
}); //Chiudo
//Codice


Le classi anonime non hanno costruttore (ovvio, come lo chiameremmo?) e possono accedere alle variabili d'istanza e alle variabili locali (del metodo in cui sono create) dichiarate final.

Ps: non abbusare delle classi anonime, una volta ho creato una calcolatrice con una classe anonima per ogni bottone :p
Ultima modifica effettuata da Guglielmoqwerty 07/08/13 14:07
aaa
07/08/13 16:08
Lagaslen
GRAZIE MILLE! Sei pazientissimo e disponibilissimo e raro trovare utenti come te:k:

PS. Credo finalmente di aver trovato il linguaggio che mi piace davvero e mi da soddisfazione dopo aver provato Python C/C++ Ruby Perl Assembly C# Pascal e Basic(si lo so....... :asd:)
Ultima modifica effettuata da Lagaslen 07/08/13 16:11
aaa
07/08/13 16:39
Guglielmoqwerty
ok, felice che tu abbia risolto :D

Alla prossima. Secondo me con Java ti troverai bene per la sua semplicità iniziale ;) Buon Lavoro.
aaa
07/08/13 18:37
Lagaslen
Bhe il prossimo passo dopo aver imparato per bene le Swing passerò al 2d e successivamente al 3d e cosi la mia fase di conversione a notch è completa hahahah
aaa