Erstellen Sie einen Zähler für Action Veranstaltungen
-
28-09-2019 - |
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?
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();
}
});
}
}