AIUTOOOO!!

di il
10 risposte

AIUTOOOO!!

Ciao a tutti, sono alle prese con un programmino in java, più precisamente con una simuazione del classico gioco memory. Detta un pò brevemente.. ho costruito una serie di pulsanti con un metodo personalizzato che ho chiamato makeButton e attraverso l'utilizzo di una classe anonima gli ho collegato l'evento. Poi ho costruito un timer che dovrebbe partire dal momento in cui si clicca la prima volta su un pulsante. Il mio problema è: in che punto devo inserire il metodo timer.start(); per farlo partire???? io ho provato in diversi modi ma anche se non mi da errori in compilazione non funziona. Sarei felicissimo di ricevere qualche indicazione. Il codice è:

class MyPanel extends JPanel
{
public MyPanel()
{
setLayout(new BorderLayout());

JLabel label1 = new JLabel(\"Time:\");
JLabel label2 = new JLabel(\"0\");
panel = new JPanel();
panel.add(label1);
panel.add(label2);

add(panel, BorderLayout.NORTH);
panel = new JPanel();
panel.setLayout(new GridLayout(5,6,3,3));
makeButton(new ImageIcon(\"bg.gif\"),new ImageIcon(\"c1.gif\"));
..
..
add(panel, BorderLayout.CENTER);
}
void makeButton(ImageIcon icon, final ImageIcon iconcard)
{
timer.start();
final JButton button = new JButton(icon);
panel.add(button);
button.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
button.setIcon(iconcard);

}
});
}

class MyTimer extends Thread {
int c = 0;
public void run()
{
while(true)
{
try {
sleep(5000);
label2.setText(\" \" +c);
++c;
}
catch(Exception eccezione)
{
eccezione.printStackTrace();
}
}
}
}

MyTimer timer = new MyTimer();

private JLabel label2;
private JPanel panel;
}

10 Risposte

  • Re: AIUTOOOO!!

    Devi gestire l'evento relativo al click sul pulsante. Questo lo fai definendo una inner class che implementa l'interfaccia ActionListener (quella appunto relativa al click sul componente).
    All'interno di questa inner class devi ridefinire il metodo actionPerformed()che è appunto il metodo che viene eseguito quando il pulsante viene premuto. Dunque io farei partire il tuo timer() all'interno di questo metodo (e penso sia quello che vuoi anche tu)
  • Re: AIUTOOOO!!

    Grazie per avermi risposto. Ma ho ancora una perplessità, ma la inner class che mi faccia partire il timer, a cosa deve essere interna?? alla outer class che estende JPanel o al metodo makeButton?? secondo te un costrutto del genere può funzionare?!
    public class StartTimer implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
    {
    timer.start();
    }
    }

    perchè come prima non da errori di compilazione ma il timer non parte.
  • Re: AIUTOOOO!!

    E' esattamente quello che devi fare. La inner class deve essere interna alla classe che definisce il metodo makeButton(). L'unica cosa che ti devi ricordare è di aggiungere l'actionListener al pulsante.
    Dunque, quando creerai il pulsante farai qualcosa del tipo:

    myButton.addActionListener(new StartTimer());
  • Re: AIUTOOOO!!

    Scusami ancora un secondo, ma io costruisco i pulsanti chiamando il metodo makeButton che è definito in questo modo:

    void makeButton(ImageIcon icon, final ImageIcon iconcard)
    {
    final JButton button = new JButton(icon);
    panel.add(button);
    button.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {
    button.setIcon(iconcard);
    }
    });
    }

    Adesso come posso aggiungere al metodo makeButton il secondo evento che farebbe partire il timer??? ho provato così ma non funziona..

    void makeButton(ImageIcon icon, final ImageIcon iconcard)
    {
    final JButton button = new JButton(icon);
    panel.add(button);
    button.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent event)
    {
    button.setIcon(iconcard);
    }
    });
    button.addActionListener(new StartTimer());
    }

    forse devo aggiungere qualcosa ai parametri formali di makeButton??!
  • Re: AIUTOOOO!!

    Il metodo actionPerformed() va inserito all'interno di una inner class che implementa l'interfaccia ActionListener.

    class MyClass {

    //Costruttore e cazzi vari (incluso il metodo makeButton)

    class ButtonListener implements ActionListener {

    public ButtonListener() {
    // Normale costruttore, gestiscilo come ti serve
    }

    public void actionPerformed(ActionEvent e) {

    // Qua va il codice che deve essere eseguito quando viene cliccato

    }
    }
  • Re: AIUTOOOO!!

    Scusami ma io sono un principiante e certe cose sui libri non ci sono scritte e altre cose sui forum non te le dicono..
    Io ho bisogno di un timer che funzioni da contatore e ad ogni secondo mi incrementi una label e l'ho costruito in questo modo:

    int c = 0;
    Timer timer = new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent event)
    {
    label.setText(\"Time: \" +c);
    ++c;
    }
    }
    );

    poi ho definito una classe rilevatore di eventi che non faccia altro che far partire il mio timer e l'ho fatto in questo modo:

    public class StartTimerAction implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
    {
    timer.start();
    }
    }

    poi ho ridefinito il mio metodo makeButton aggiungendogli il secondo rilevatore di eventi che mi fa partire il timer e l'ho fatto così:

    void makeButton(...)
    {
    ....
    button.addActionListener(new StartTimerAction());
    }

    e comunque il timer non parte, magari per te è una stupidaggine ma io sono già in difficoltà, sarei molto contento di ricevere una risposta e grazie ancora una volta.
  • Re: AIUTOOOO!!

    Non ho mai usato la classe Timer quindi potrei sbagliarmi. Cmq l'evento che fa partire il Timer è corretto (esegue Timer.start() ogni volta che viene premuto il pulsante).
    Quello che non capisco è questo:

    Timer timer = new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent event)
    {
    label.setText(\"Time: \" +c);
    ++c;
    }

    Perchè implementi un metodo actionPerformed() fuori dalla inner class?
  • Re: AIUTOOOO!!

    Eh l'ho fatto così perchè mi sono un pò documentato in giro e ho scoperto che i modi più veloci e più semplici per fare un timer che aggiorni una label sono due, o si utilizza la classe Timer di Swing e si fa una cosa di questo tipo:

    int c = 0;
    Timer timer = new Timer(1000, new ActionListener() {
    public void actionPerformed(ActionEvent event)
    {
    label.setText(\"Time: \" +c);
    ++c;
    }
    }
    );

    o se no si può usare un Thread e fare una cosa così:

    class Timer extends Thread {
    int c = 0;
    public void run()
    {
    while(true)
    {
    try
    {
    sleep(1000);
    label.setText(\"Time: \" +c);
    ++c;
    }
    catch(Exception eccezione)
    {
    eccezione.printStackTrace();
    }
    }
    }
    }
    Timer timer = new Timer();

    io ho provato a metterlo come dici te all'interno della inner class però è come se il timer fosse invisibile, non viene proprio eseguito..
    questi due modi comunque dovrebbero essere giusti... tu hai qualche idea su come poterli utilizzare???
  • Re: AIUTOOOO!!

    Io sono per l'uso di un thread (in modo da isolare il timer dal resto dell'applicazione)
  • Re: AIUTOOOO!!

    Ok... io però non sono pratico neanche di thread..
    Se uso un thread, oltre che ad aggiungere il rilevatore di evento \"StartTimerAction\" ai pulsanti nel metodo makeButton e oltre a creare un'istanza della classe Thread che è Timer:

    class Timer extends Thread {
    int c = 0;
    public void run()
    {
    while(true)
    {
    try
    {
    sleep(1000);
    label.setText(\"Time: \" +c);
    ++c;
    }
    catch(Exception eccezione)
    {
    eccezione.printStackTrace();
    }
    }
    }
    }

    perchè una cosa di questo tipo è sbagliata???

    public class StartTimerAction implements ActionListener
    {
    public void actionPerformed(ActionEvent event)
    {
    timer.start();
    }

    }

    Timer timer = new Timer(1000, StartTimerAction);

    il costruttore del timer dove lo devo mettere???
    e altra cosa nel secondo parametro che si passa al timer non ci va il nome della classe che è stata definita come rilevatore di evento??
    e allora perchè me lo segna errore..???

    Grazie per le indicazioni che mi hai dato fino ad ora...
Devi accedere o registrarti per scrivere nel forum
10 risposte