Problema con una ActionListener

di il
4 risposte

Problema con una ActionListener

Salve a tutti! sono nuova nel forum e anche abbastanza disperata! ma vi illustro subito il mio problema:
ho scritto un piccolo progetto java inerente al gioco del Milionario.
avevo delle difficoltà a creare il mio ascoltatore di eventi e mi sono rivolta ad un amico che mi ha consigliato questo codice.
tuttavia non riesco a capire le tre righe di codice nel metodo actionPerformed.. soprattutto quella scrittura button.answer (perchè il punto? answer è una variabile, perchè è scritta in quel modo? )
inoltre come si usa quel getSource()?
Per rendere più comprensibile il tutto vi dico che:
La classe Manager è quella che controlla il gioco (fa partire le domande ecc)
il metodo hendleAnswer(answer) è un metodo della classe Manager e ha il compito di gestire la domanda, se giusta va avanti il gioco, se sbagliata fine gioco.
La classe MilionaireButton è quella che racchiude i 4 bottoni delle 4 risposte e ha un costruttore con due parametri: il testo e la risposta di tipo Answer
La classe Answer è la classe delle risposte e ha un costruttore con due parametri, il testo e il booleano vero/falso

Spero di non essere stata troppo prolissa e abbastanza chiara.
Please, help me!

public class ClickAnswerListener implements ActionListener
{

public Manager manager;

public ClickAnswerListener(Manager manager){
this.manager = manager;
}

@Override
public void actionPerformed(ActionEvent event){
MillionaireButton button = (MillionaireButton) event.getSource();
Answer answer = button.answer; //??
this.manager.handleAnswer(answer);
}

}

4 Risposte

  • Re: Problema con una ActionListener

    maty ha scritto:


    soprattutto quella scrittura button.answer (perchè il punto? answer è una variabile, perchè è scritta in quel modo?
    Da quanto si vede (non molto ma si può intuire ..) MillionaireButton è una classe specifica che rappresenta graficamente il pulsante.
    Dal codice non si capisce ... probabilmente MillionaireButton estende la classe JButton (il "pulsante" in Swing). E' così?

    Ed avendo una classe apposita, chi l'ha scritta ha "esposto" all'esterno direttamente un campo (variabile di istanza) pubblico chiamato "answer". Non è bellissimo a livello di "design" ma vabbè ...

    Chi istanzia ClickAnswerListener deve passare il Manager e il listener se lo tiene referenziato. Al actionPerformed, invoca handleAnswer (gestisci la risposta) su quell'oggetto manager ricevuto, passandogli l'oggetto Answer.

    Di altro non si può dire (né sia tutto buono/valido oppure no).

    maty ha scritto:


    inoltre come si usa quel getSource()?
    In generale il source ("sorgente") di un evento è il componente (o in generale un qualunque oggetto) che ha scatenato quell'evento. Se su una istanza x di un JButton registri un ActionListener, quando l'evento viene scatenato, il source è il riferimento esattamente a quella precisa istanza x del JButton.
  • Re: Problema con una ActionListener

    Ciao andbin!
    Innanzi tutto grazie per la risposta!
    Allora, si la classe MillionaireButton è scritta così (avrei dovuto essere più precisa, sorry):

    public class MillionaireButton extends JButton {

    public Answer answer;

    public MillionaireButton(String text, Answer answer){
    this.answer = answer;
    super.setText(text); //setta il testo della risposta
    }

    public void setAnswer(Answer answer){
    this.answer = answer;
    this.setText(answer.getText());
    }

    public Answer getAnswer(){
    return this.answer;
    }
    }

    Se non ho capito male il punto della situazione è proprio quella variabile di istanza "public Answer answer;".
    Quindi, il succo della questione è : il getSource() va a "vedere" quale pulsante è stato premuto e lo converte forzatamente (cast) ad un MillionaireButton restituendomi l'oggetto "button". Poi di questo oggetto button vado a "prendere" la sua variabile parametro "answer" tramite quel button.answer creando così la variabile answer di tipo Answer. Successivamente prendo questa nuova variabile e la do "in pasto" all'handleAnswer.
    Ho capito bene?

    Grazie in anticipo per la pazienza! (sono un pò testona eheh!)
  • Re: Problema con una ActionListener

    maty ha scritto:


    public class MillionaireButton extends JButton {
    Come immaginavo ....

    maty ha scritto:


    Se non ho capito male il punto della situazione è proprio quella variabile di istanza "public Answer answer;".
    Questa è una questione (non c'entra il source).

    La classe ha una variabile di istanza ("campo", detto brevemente) che è pubblico, quindi è accessibile direttamente. Se si ha il riferimento (non null) ad un oggetto MillionaireButton, quindi è possibile fare

    oggMillionaireButton.answer

    (oggMillionaireButton è solo un ipotetico nome di variabile, non conta)

    maty ha scritto:


    Quindi, il succo della questione è : il getSource() va a "vedere" quale pulsante è stato premuto
    Una implementazione di un listener (e come caso più particolare anche la medesima istanza del listener) potrebbe essere registrata su più pulsanti.

    Poter avere il source, cioè il componente che ha scatenato l'evento ti permette di fare 2 cose:
    - distinguere quale tra gli N pulsanti è quello dell'evento, SE dovessi fare cose "diverse" per ciascun pulsante.
    - fare una certa cosa su quel source senza dover sapere quale tra gli N sia (è il tuo caso: prendi l'answer dal pulsante cliccato, quale sia non importa).

    maty ha scritto:


    lo converte forzatamente (cast) ad un MillionaireButton
    Sì, perché getSource() è generalizzato ed ha come tipo di ritorno un java.lang.Object. Sei tu che devi "sapere" quale tipo ti aspetti e quindi fare un cast esplicito.

    maty ha scritto:


    Poi di questo oggetto button vado a "prendere" la sua variabile parametro "answer" tramite quel button.answer creando così la variabile answer di tipo Answer. Successivamente prendo questa nuova variabile e la do "in pasto" all'handleAnswer.
    Ho capito bene?
    Sì, sostanzialmente è così.
  • Re: Problema con una ActionListener

    Perfetto, mistero risolto! eheheh sei stato molto utile
    Grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte