Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Aiuto sui Listener e sugli eventi SWING.
Forum - Java - Aiuto sui Listener e sugli eventi SWING.

Avatar
Lagaslen (Normal User)
Newbie


Messaggi: 20
Iscritto: 14/03/2013

Segnala al moderatore
Postato alle 18:20
Martedì, 06/08/2013
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 :)

PM Quote
Avatar
Guglielmoqwerty (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/07/2013

Segnala al moderatore
Postato alle 12:40
Mercoledì, 07/08/2013
Allora, come guida ti coniglio questa: http://www.skenz.it/traduttori/risorse/OO_&&_JAVA5.pdf (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:
Codice sorgente - presumibilmente Java

  1. [CODE]
  2. import java.awt.*; //Uso AWT, ma il concetto è lo stesso!
  3.  
  4. public class TrueDelegationModel
  5. {
  6.      private Frame f;
  7.      private Button b;
  8.      private Label l;
  9.  
  10.      public TrueDelegationModel()
  11.      {
  12.           f = new Frame("Delegation Model");
  13.           b = new Button("Press Me");
  14.           l = new Label();
  15.      }
  16.  
  17.      public void setup()
  18.      {
  19.           b.addActionListener(new TrueButtonHandler(l)); //Devo passare come parametro un oggetto di una classe che implementi ActionListener
  20.          
  21.           f.add(b,BorderLayout.CENTER);
  22.           f.add(l,BorderLayout.SOUTH);
  23.           f.pack();
  24.           f.setVisible(true);
  25.      }
  26.  
  27.      public static void main(String args[])
  28.      {
  29.           TrueDelegationModel delegationModel = new TrueDelegationModel();
  30.           delegationModel.setup();
  31.      }
  32. }
  33. [/CODE]



Codice sorgente - presumibilmente Java

  1. [CODE]
  2. import java.awt.event.*; //Package in cui è presente l'interfaccia ActionListener
  3. import java.awt.*;
  4.  
  5. public class TrueButtonHandler implements ActionListener //implemento la famosa interfaccia
  6. {
  7.      private Label l;
  8.      private int counter;
  9.  
  10.      public TrueButtonHandler(Label l)
  11.      {
  12.           this.l = l; //Passo il reference del label per poterlo modificare da questo oggetto
  13.      }
  14.  
  15. /*
  16.       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.
  17. */
  18.      public void actionPerformed(ActionEvent e)
  19.      {
  20.           l.setText(e.getActionCommand() + " - " + (++counter));
  21.      }
  22. }
  23. [/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)

PM Quote
Avatar
Lagaslen (Normal User)
Newbie


Messaggi: 20
Iscritto: 14/03/2013

Segnala al moderatore
Postato alle 14:17
Mercoledì, 07/08/2013
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 il 07/08/2013 alle 14:23
PM Quote
Avatar
Guglielmoqwerty (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/07/2013

Segnala al moderatore
Postato alle 14:42
Mercoledì, 07/08/2013
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 il 07/08/2013 alle 16:07
PM Quote
Avatar
Lagaslen (Normal User)
Newbie


Messaggi: 20
Iscritto: 14/03/2013

Segnala al moderatore
Postato alle 18:08
Mercoledì, 07/08/2013
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 il 07/08/2013 alle 18:11
PM Quote
Avatar
Guglielmoqwerty (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/07/2013

Segnala al moderatore
Postato alle 18:39
Mercoledì, 07/08/2013
ok, felice che tu abbia risolto :D

Alla prossima. Secondo me con Java ti troverai bene per la sua semplicità iniziale ;) Buon Lavoro.

PM Quote
Avatar
Lagaslen (Normal User)
Newbie


Messaggi: 20
Iscritto: 14/03/2013

Segnala al moderatore
Postato alle 20:37
Mercoledì, 07/08/2013
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

PM Quote