注意:我的英语不是最好的所以请不要太在意语法错误。
嘿那里,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.
}
如果你能帮助我请回复帖子。感谢。
答案 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
但它不起作用,因为编译器期望clicks
为final
。哪个与您的使用不兼容:您在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
代替普通int
或double
来存储点击,并在动作监听器之外声明此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。