إنشاء عداد لأحداث ActionListener
-
28-09-2019 - |
سؤال
لديّ Jbutton في برنامجي ، محدد على النحو التالي (أكثر أو أقل)
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++;
}
}
);
}
}
أريد أن أكون قادرًا على حساب عدد المرات التي يتم فيها النقر فوق الزر. المشكلة هي أنه لا يمكنني إعلان عداد ثم زيادة ذلك بعد الدعوة إلى .dosomething () ، لأن المتغير يجب أن يكون نهائيًا بالنسبة لي للرجوع إليه في الفصل الداخلي.
هل هناك طريقة للقيام بذلك ، بخلاف إنشاء فئة Wrapper الخاصة بي مع طريقة .increment () الخاصة بها؟
المحلول
اعتمادًا على وضع الخيوط ، يمكنك نقل المتغير إلى الفئة المرفقة. ولكن هذا يمكن أن يحدث خطأ للغاية إذا استدعت foo()
عدة مرات ، لأن ذلك سيستخدم نفس العداد.
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++;
}
}
);
}
}
نصائح أخرى
يمكنك نقل العداد الخاص بك من خارج ActionListener
إلى الداخل ، مما يجعلها عضوًا في المستمع.
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++;
}
});
}
}
كما اقترح AKF ، يمكن أن يكون العداد عضوًا في فصل متداخل ، يكون من بين أعضاء المثال المرفق مرئيًا. هذا المثال ينفذ ActionListener
لتوسيع AbstractAction
.
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();
}
});
}
}