Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata

[Java] Come generare un evento custom.

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto UtenteMassimoB

0
voti

[1] [Java] Come generare un evento custom.

Messaggioda Foto UtenteTardoFreak » 9 gen 2014, 19:48

Un saluto a tutti i partecipanti,
Per semplificarmi il lavoro e per poter riutilizzare il codice ho scritto una classe che estende javax.swing.JPanel che è un semplice contenitore con una sola combo box, punto e basta.
Ovviamente all' interno di questa classe JTardoCombo ho implementato un bel po' di metodi che mi semplificano la programmazione (riempiono il combo in un certo modo facendo operazioni non banali) e che mi permetteranno di utilizzare quasta JCombo personalizzata in altri punti del programma.
Ora però mi sono bloccato perché vorrei scrivere un qualcosa (dentro TardoCombo) che mi generi un evento che funzioni esattamente come l' evento ActionPerformed del JCombo in modo da poter scrivere nel form che mi contiene il mio combo personalizzato un metodo per ascoltare l' evento da lui generato.
Nel form principale dovrebbe trovare posto un qualcosa del genere:
private void jTardoComboActionPerformed(java.awt.event.ActionEvent evt) {
// codice che mi gestisce l' evento generato da tardoCombo
}

Il problema è che non ho proprio idea di cosa scrivere nel mio JPanel personalizzato (TardoCombo) in modo da poter generare (quando lo voglio io) questo benedetto evento.

Ringrazio anticipatamente. iOi
Nel data sheet si trova tutto. Anche gli errori.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
PIERIN-PIC18
Avatar utente
Foto UtenteTardoFreak
71,3k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 15601
Iscritto il: 16 dic 2009, 10:10
Località: Torino - 3° pianeta del Sistema Solare

1
voti

[2] Re: [Java] Come generare un evento custom.

Messaggioda Foto Utentec1b8 » 9 gen 2014, 21:34

Ciao,
dovresti procedere in questo modo:
Definire una interfaccia che elenchi/descriva gli eventi generati dal tuo oggetto. Ad esempio
Codice: Seleziona tutto
public interface JTardoComboListener extends EventListener {
    public void actionPerformed(java.awt.event.ActionEvent evt);
    public void evento2();
    public void evento3(JTardoComdo obj);
    public void evento4(JTardoComboEvent evt);
}

I metodi dell'interfaccia sono gli eventi possibili, ogni metodo può ricevere o meno degli oggetti.
Nel mio esempio il primo evento (ActionPerformed) riceve un oggetto generico, il secondo evento nessun parametro, il terzo l'oggetto che ha generato l'evento.
In genere si definisce una classe evento dedicato e si passa al metodo un oggetto di quella classe. Come l'evento4 che riceve un oggetto del tipo:
Codice: Seleziona tutto
public class JTardoComboEvent extends EventObject {
   private String aaa;
   private int x;
...
...
}

In questa classe evento trovano posto tutti i metodi e attributi necessari a descrivere l'evento.
L'utilizzo di questo oggetto evento personalizzato io solitamente lo evito.

La tua classe JTardoCombo dovrà conoscere tutti gli "ascoltatori", coloro i quali desiderano essere notificati da eventi. Per questo avrà un metodo addJTardoComboListener(JTardoComboListener listener) che aggiungerà ad una lista gli oggetti passatigli:
Codice: Seleziona tutto
public class JTardoCombo extends javax.swing.JPanel {
    private JTardoComboListener[] listeners= new JTardoComboListener [MAX_LISTENERS]; // per prevedere al massimo MAX_LISTENERS, oppure usi Vector o HashMap o altro
    int numListeners=0;
...
...
   public void addJTardoComboListener(JTardoComboListener listener) {
      listeners [numListeners]=listener;
      numListeners=++;
   }
}


Nel momento in cui devi generare l'evento la tua classe JTardoCombo richiamerà il metodo corretto dell'interfaccia listener per tutti i listeners aggiunti alla lista:
Codice: Seleziona tutto
    // Genero il codice per l'evento3
    for (int i=0; i<numListeners; i++) {
       listeners [i].evento3(this);
    }

Per l'evento 4 prima creo l'oggeto da passare, lo valorizzo correttamente e quindi notifico:
Codice: Seleziona tutto
    // Genero il codice per l'evento4
    JTardoComboEvent  evt=new JTardoComboEvent();
    ....  // Imposto le proprieta dell'ggetto evt appena creato
    for (int i=0; i<numListeners; i++) {
       listeners [i].evento4(evt);
    }


Nel form principale dovrai richiamare il metodo addJTardoComboListener:
Codice: Seleziona tutto
      JTardoCombo  combo = new JTardoCombo();
      ... // altre impostazioni
      combo.addJTardoComboListener(this);

Questa add ti costringe a definire la form come implementazione dell'interfaccia JTardoComboListener e definire tutti i metodi dell'interfaccia stessa all'interno della form.

Spero che questo sia quello che cercavi.
Fabio
Avatar utente
Foto Utentec1b8
3.590 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1797
Iscritto il: 15 gen 2009, 14:23

0
voti

[3] Re: [Java] Come generare un evento custom.

Messaggioda Foto UtenteTardoFreak » 9 gen 2014, 23:24

Quindi devo per forza scrivere un ascoltatore di eventi dedicato.
Speravo di non doverlo fare ma tant' è.

Grazie per la risposta. :-)
Nel data sheet si trova tutto. Anche gli errori.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
PIERIN-PIC18
Avatar utente
Foto UtenteTardoFreak
71,3k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 15601
Iscritto il: 16 dic 2009, 10:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[4] Re: [Java] Come generare un evento custom.

Messaggioda Foto Utentec1b8 » 9 gen 2014, 23:27

TardoFreak ha scritto:Quindi devo per forza scrivere un ascoltatore di eventi dedicato.

In che senso un ascoltatore dedicato?
L'ascoltatore è la tua form, devi descrivere gli eventi personalizzati e lo fai attraverso l'interfaccia, quella si deve essere dedicata per il tipo di eventi che vuoi generare.
Fabio
Avatar utente
Foto Utentec1b8
3.590 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1797
Iscritto il: 15 gen 2009, 14:23

0
voti

[5] Re: [Java] Come generare un evento custom.

Messaggioda Foto UtenteTardoFreak » 9 gen 2014, 23:30

Uhm ... forse ho scritto una cazzata. Ora vado a vedere il codice generato da NetBeams per vedere se ad ogni controllo inserisce un ascoltatore.

Edit: Si, ci infila un ascoltatore per ogni controllo che genera un evento.

Come non detto!
Nel data sheet si trova tutto. Anche gli errori.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
PIERIN-PIC18
Avatar utente
Foto UtenteTardoFreak
71,3k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 15601
Iscritto il: 16 dic 2009, 10:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[6] Re: [Java] Come generare un evento custom.

Messaggioda Foto UtenteTardoFreak » 10 gen 2014, 16:18

Ho risolto il problema. :ok:
Vorrei però avere conferma di quello che ho fatto visto che sto studiando il Java ed è la prima volta che implemento un qualcosa del genere. Funziona tutto ma ho ancora qualche dubbio e non andrò avanti fino a quando non mi sarà tutto chiaro.
La classe del pannello con il combo si chiama ComboCategorieMat che starebbe per "combo specifico per le categorie dei materiali".
Per prima cosa ho scritto questa interfaccia
Codice: Seleziona tutto
public interface ComboCategorieMatListener extends EventListener {
  public void actionPerformed(java.awt.event.ActionEvent evt);
}

Che, essendo un' interfaccia, pretenderà che il metodo actionPerformed sia implementato.

All' interno del pannello ho dichiarato una ArrayList per raccoggliere tutti coloro che vorranno servirsi dell' evento custom che ho scritto.
Codice: Seleziona tutto
private ArrayList<ComboCategorieMatListener> ascoltatori = new ArrayList<ComboCategorieMatListener>();

Quindi ho implementato il metodo per aggiungere gli ascoltatori alla lista
Codice: Seleziona tutto
  public void addActionListener(ComboCategorieMatListener l) {
    ascoltatori.add(l);
  }

ed infine ho implementato un mio metodo privato per generare l' evento. Ora ne ho implementato un solo tipo ma penso che potrei implementarne altri cambiando semplicemente la stringa "SELECTED" o la costante ActionEvent.ACTION_PERFORMED dell' evento.
Codice: Seleziona tutto
  private void generaEvento() {
    int n = ascoltatori.size();
    ActionEvent e = new ActionEvent(this,ActionEvent.ACTION_PERFORMED,"SELECTED");
   
    if (n>0) {
      int i;
      for (i=0; i<n; i++) ascoltatori.get(i).actionPerformed(e);
    }
  }

E' vero che avrei potuto farlo con un ciclo foreach ma lasciamo perdere, almeno per ora.

Nel costruttore del form che contiene questo combo (chiamato comboCat), dopo tutte le inizializzazioni che l' IDE ha generato, ho aggiunto questo codice
Codice: Seleziona tutto
    comboCat.addActionListener(new ComboCategorieMatListener() {
      @Override
      public void actionPerformed(java.awt.event.ActionEvent evt) {
        combCatActionPerformed();
      }
     });

Dove eventualmente posso sapere anche il tipo di evento che il mio combo ha generato modificando, appunto, l' evento nel metodo generaEvento.

Ed infine sono andato a scrivermi in una posizione "comoda" il metodo combCatActionPerformed anche se non è strettamente necessario.
Codice: Seleziona tutto
  private void combCatActionPerformed() {
    System.out.println("Evento custom ricevuto ora");     
  }


Aspetto con ansia commenti e correzioni.
Nel data sheet si trova tutto. Anche gli errori.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
PIERIN-PIC18
Avatar utente
Foto UtenteTardoFreak
71,3k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 15601
Iscritto il: 16 dic 2009, 10:10
Località: Torino - 3° pianeta del Sistema Solare

1
voti

[7] Re: [Java] Come generare un evento custom.

Messaggioda Foto Utentec1b8 » 10 gen 2014, 16:41

E' tutto corretto, non c'erano dubbi a riguardo, e lo dimostra il fatto che funziona.
Io però avrei fatto 2 cose in modo diverso.

1) L'evento non lo avrei chiamato actionPerformed. Questo solo perché con quel nome esiste un evento già codificato dalle claasi Java standard e lo avrei quindi differenziato come nome per non correre il rischio di "confonderlo". Lo avrei chiamato myActionPerformed per chiarire che è lo stesso evento ma personalizzato.

2) Nella form avrei proceduto in modo diverso.
La tua form è probabilmente qualche cosa del tipo:
Codice: Seleziona tutto
public class Form extends JFrame

avrei detto che la form implementa la tua inferfaccia:
Codice: Seleziona tutto
public class Form extends JFrame implements ComboCategorieMatListener

Questo obbliga ad inserire nella form il metodo myActionPerformed, in un punto qualsiasi della form dovrai quindi scrivere:
Codice: Seleziona tutto
      @Override
      public void myActionPerformed(java.awt.event.ActionEvent evt) {
        combCatActionPerformed();
      }

che essendo già in un punto più comodo della form non ha bisogno di richiamare combCatActionPerformed(); ma potrebbe contenere già quello che la combCatActionPerformed(); esegue.

Nel costruttore della form va semplicemente fatto:
Codice: Seleziona tutto
       comboCat.addActionListener(this);


Nel modo che hai fatto tu se hai nella stessa form più combo, hai più metodi myActionPerformed che poi richiameranno lo stesso combCatActionPerformed passando in qualche modo il riferimento al combo che ha generato l'evento, o che eseguiranno direttamente le istruzioni necessarie per lo specifico combo.
Nel modo che uso io il metodo myActionPerformed è sempre uno solo anche per più combo e riceve direttamente l'oggetto che ha generato l'evento (oggetto combo contenuto in evt).
Fabio
Avatar utente
Foto Utentec1b8
3.590 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1797
Iscritto il: 15 gen 2009, 14:23

0
voti

[8] Re: [Java] Come generare un evento custom.

Messaggioda Foto UtenteTardoFreak » 10 gen 2014, 17:21

Ti ringrazio veramente tanto e mi complimento per la tua conoscenza. =D>
Hai spiegato la cosa in modo egregio e questa discussione la metto fra i miei preferiti. :ok:
Nel data sheet si trova tutto. Anche gli errori.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
PIERIN-PIC18
Avatar utente
Foto UtenteTardoFreak
71,3k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 15601
Iscritto il: 16 dic 2009, 10:10
Località: Torino - 3° pianeta del Sistema Solare


Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti