java的;如何在Action Listener之外获取变量?

时间:2017-08-07 09:50:32

标签: java

注意:我的英语不是最好的所以请不要太在意语法错误。

嘿那里,java初学者在这里,无论如何我正在编写我的CPS测试程序,就像第一个迷你程序一样。无论如何,这个问题可能在之前被问过,但是, 我需要在ActionListener代码之外获取变量:

public static void startB() {
 Font f = new Font(null, Font.BOLD , 0);

    Font size = f.deriveFont(20f);

    JLabel text = new JLabel("");
    text.setPreferredSize(new Dimension(250,250));
    text.setFont(size);

    JButton b = new JButton();
    JFrame cps = new JFrame("CLICK");
    cps.setPreferredSize(new Dimension(400,400));
    cps.setLocationRelativeTo(null);
    cps.setLayout(new FlowLayout());
    b.setText("<html> CLICK ME <br> As much as you can! <html> ");
    cps.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    cps.getContentPane().add(b , BorderLayout.CENTER);
    cps.getContentPane().add(text, BorderLayout.CENTER);
    cps.pack();
    cps.setVisible(true);

    text.setText("<html> Starting in... <br> 3<html>");
    try {
        TimeUnit.SECONDS.sleep((long)1.0);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    text.setText("<html> Starting in... <br> 2<html>");
    try {
        TimeUnit.SECONDS.sleep((long)1.0);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    text.setText("<html> Starting in... <br> 1<html>");
    try {
        TimeUnit.SECONDS.sleep((long)1.0);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    text.setText("<html> CLICK! <html>");
    b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            double clicks = 0;
            clicks++;
            // How to get Clicks variable out of the actionListener?
        }
    });
    try {
        TimeUnit.SECONDS.sleep((long)10.0);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    //I need get the Clicks Variable to here.
}

如果你能帮助我请回复帖子。感谢。

2 个答案:

答案 0 :(得分:3)

在这里,您可以创建一个ActionListener的匿名类:

b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    double clicks = 0;
    clicks++;
        // How to get Clicks variable out of the actionListener?

    }
  });

你在里面声明了clicks变量 您可以在外部类中声明clicks但它不起作用,因为编译器期望clicksfinal。哪个与您的使用不兼容:您在actionPerformed()内改变它。

实现您需求的另一种方法是创建ActionListener的非匿名实现,您将clicks存储为字段,并提供一个getter来检索它的值。

它可能是一个内部阶级:

private static class MyActionListener implements ActionListener {

    private double clicks;

    @Override
    public void actionPerformed(ActionEvent e) {
        clicks++;
    }

    public double getClicks() {
        return clicks;
    }

}

你可以这样使用它:

MyActionListener actionListener = new MyActionListener();
myComponent.addActionListener(actionListener);
...
// later retrieve clicks
double clicks = actionListener.getClicks();

答案 1 :(得分:1)

您只能在匿名内部类中访问外部类的final个变量。但是由于修饰符final表明这样的变量的值一旦被赋值就不能再改变了。

为避免这种情况,您可以使用AtomicInteger代替普通intdouble来存储点击,并在动作监听器之外声明此final变量:< / p>

final AtomicInteger clicks = new AtomicInteger(0);
b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        clicks.incrementAndGet();
    }
}
clicks.get(); // will return the desired number of invocations of actionPerformed

通过这种方式,您仍然可以为动作侦听器使用匿名类。

从代码风格的角度来看,最好定义一个命名类,并为其他答案中建议的点击次数提供一个getter。