سؤال

لديّ 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();
            }
        });
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top