Frage

Ich habe einen JButton in meinem Programm, wie folgt definiert (mehr oder weniger)

public class MyTester{
    public static void main(String[] args)
    {

        int counter = 0;    

        JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent ae) {
                startButton.doSomething()
                counter++;
             }
           }
         );
    }
}

Ich mag die Anzahl der Male zählen können, dass die Schaltfläche geklickt wird. Das Problem ist, ich kann nicht einen Zähler deklarieren und dann erhöhen, nach dem Aufruf von .doSomething (), da die Variable endgültig sein muss, für mich ist es in der inneren Klasse zu verweisen.

Gibt es eine Möglichkeit, dies zu tun, außer meine eigene Wrapper-Klasse mit einem eigenen .increment () -Methode erstellen?

War es hilfreich?

Lösung

Je nach Einfädeln Situation können Sie die Variable in der umgebenden Klasse bewegen. Aber dies kann sehr schief gehen, wenn Sie invoke foo() mehrmals, denn das ist den gleichen Zähler verwenden.

public class MyClass {

    // Notice the placement outside the main()    
    private static int counter = 0;

    public static void main(String[] args) {
        JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent ae) {
                startButton.doSomething()
                //do some more stuff

                counter++;

             }
           }
         );    
    }
}

Andere Tipps

Sie können Ihre Zähler von außerhalb des ActionListener nach innen bewegen, ist es ein Mitglied des Zuhörers zu machen.

public class MyTester {
    public static void main(String[] args) {
        final JButton startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {           
            int counter; // you make one per listener
            public void actionPerformed(ActionEvent e) {
                startButton.doSomething();
                counter++;
            }
        });
    }
}

Wie @akf vorgeschlagen, kann der Zähler ein Mitglied einer geschachtelten Klasse sein, aus denen die Mitglieder der umschließenden Instanz sichtbar sind. Dieses Beispiel implementiert ActionListener AbstractAction zu erweitern.

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/4290117 */
public class ClickCount extends JPanel {

    private JButton button = new JButton(new ClickHandler("Click"));
    private JLabel label = new JLabel("0");

    public ClickCount() {
        this.add(button);
        this.add(label);
    }

    private class ClickHandler extends AbstractAction {

        int counter;

        public ClickHandler(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setText(String.valueOf(++counter));
        }
    }

    private void display() {
        JFrame f = new JFrame("ClickCount");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ClickCount().display();
            }
        });
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top