Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143

    [Gestione Eventi] - EventListener dentro o fuori dalla classe principale?

    Ciao a tutti, qualcuno sa spiegarmi la differenza fra questa implementazione col gestore degli eventi dentro la classe Class1

    codice:
    Class1 extends JFrame
    {
      Class1()
      {
          ....
    
          JButton bottone1 = new JButton();
          bottone.addActionListener(new Ascoltatore());
    
          .....
      }
    
      class Asoltatore()
      {
          ....
      }
    
    }
    e questa in cui il gestore e fuori dalla classe Class1?

    codice:
    Class1 extends JFrame
    {
      Class1()
      {
          ....
    
          JButton bottone1 = new JButton();
          bottone.addActionListener(new Ascoltatore());
    
          .....
      }
    }
    
    class Asoltatore()
    {
         ....
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Gestione Eventi] - EventListener dentro o fuori dalla classe principale?

    Originariamente inviato da alesdario
    Ciao a tutti, qualcuno sa spiegarmi la differenza fra questa implementazione col gestore degli eventi dentro la classe Class1
    A livello "tecnico" non c'è alcuna differenza. Ad addActionListener tu passi un oggetto che è certo che implementa ActionListener (altrimenti non compilerebbe nemmeno!). Ma dove e a che livello è dichiarata la classe di quell'oggetto .... non importa affatto al JButton!!!
    E oltretutto esiste anche un ulteriore scenario: fare in modo che Class1 dichiari la implementazione di ActionListener (quindi actionPerformed() direttamente in Class1) e fare addActionListener(this).

    Dal punto di vista pratico e "concettuale" però le cose cambiano. Prendi il tuo secondo caso, la classe Ascoltatore che è esterna. Se tu avessi bisogno in Ascoltatore di usare campi/metodi di Class1 ... che fai? Innanzitutto dovresti passare ad Ascoltatore il reference all'oggetto Class1, come minimo. Ma se i campi/metodi fossero "privati"... che fai? Vai ad "aprire" di più il livello di accesso? E sei sicuro che sarebbe una buona cosa??

    Hai già intuito qualcosa? La gestione degli eventi generalmente è una cosa da fare in modo molto "intimo" con la classe dove ci sono i componenti e la gestione di quella interfaccia utente.
    La gestione dei "listener" è stata introdotta in Java 1.1 e in questa stessa release sono pure state introdotte le inner-class. E non a caso ....

    E ad ogni modo si dovrebbero sempre seguire i principi della OOP, uno dei quali è il concetto di "incapsulazione". Più incapsuli e nascondi e generalmente meglio è.

    Quindi bisognerebbe vedere cosa deve fare Ascoltatore e a che livello (es. se serve anche da altre parti) per cui non si può dire sì o no ai possibili scenari che sono stati descritti. Bisogna valutare .... ma ricorda, meno "esponi" le cose, meglio è.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    ok, ho capito quasi tutto della tua ottima spiegazione. L'unica cosa che non ho ben chiaro è? Per far vedere all'ascoltatore le variabili private della mia classe (cosa per la quale mi sono veramente distrutto la testa!) come posso fare?

    Grazie

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da alesdario
    Per far vedere all'ascoltatore le variabili private della mia classe (cosa per la quale mi sono veramente distrutto la testa!) come posso fare?
    Nel secondo caso l'Ascoltatore che è esterno non può assolutamente "vedere" membri private di Class1.
    Una inner class invece può.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    Originariamente inviato da andbin
    Nel secondo caso l'Ascoltatore che è esterno non può assolutamente "vedere" membri private di Class1.
    Una inner class invece può.
    Inner Class: devo specificare la classe ascoltatore all'interno della classe "primaria"? Ad esempio nella classe Class1?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da alesdario
    Inner Class: devo specificare la classe ascoltatore all'interno della classe "primaria"? Ad esempio nella classe Class1?
    È il primo "scenario" di codice che hai postato. E la inner class tienila private.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    quindi, qualcosa di questo genere...

    codice:
    Class1 extends JFrame 
    { 
       private int varaibilediprova = 0;
      
      Class1()
       { 
          ....        
         JButton bottone1 = new JButton();      
         bottone.addActionListener(new Ascoltatore());   
         .....   
        }
    
    private class Asoltatore()
    {  
       variabilediprova = 5;
         ....   
    } 
    
    }
    ....dovrebbe funzionare?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da alesdario
    ....dovrebbe funzionare?
    Ovviamente intendevi dire che variabilediprova = 5; è in un metodo/costruttore ... perché come l'hai postato è sbagliato.

    Ma come concetto, sì è quello. All'interno di Ascoltatore puoi benissimo usare qualunque membro, anche private, di Class1.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    143
    Originariamente inviato da andbin
    Ovviamente intendevi dire che variabilediprova = 5; è in un metodo/costruttore ... perché come l'hai postato è sbagliato.
    ... ... ops ... si

    Originariamente inviato da andbin
    Ma come concetto, sì è quello. All'interno di Ascoltatore puoi benissimo usare qualunque membro, anche private, di Class1.
    ok, capito tutto. Grazie Mille

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.