首先,我不是一个经验丰富的程序员或类似的东西,我试图制作一个简单的java按钮和一个文字来告诉你你曾经按过多少次说过按钮,这是目前为止的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;
public class cookieClicker {
private static void cookies() {
int a = 0;
JFrame cookie = new JFrame("Cookie Counter");
cookie.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton clickCookies = new JButton("Cookies!!");
clickCookies.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
a++;
}
} );
if ( a == 0 ) {
JLabel text1 = new JLabel("You have no cookies you fat twat!", SwingConstants.CENTER);
text1.setPreferredSize(new Dimension(400, 150));
cookie.getContentPane().add(text1, BorderLayout.CENTER);
}
else {
if ( a == 1 ) {
JLabel text2 = new JLabel("You have " + a + " cookie", SwingConstants.CENTER);
text2.setPreferredSize(new Dimension(400, 150));
cookie.getContentPane().add(text2, BorderLayout.CENTER);
}
else {
JLabel text3 = new JLabel("You have " + a + " cookies", SwingConstants.CENTER);
text3.setPreferredSize(new Dimension(400, 150));
cookie.getContentPane().add(text3, BorderLayout.CENTER);
}
}
clickCookies.setBounds(50,100,95,30);
cookie.add(clickCookies);
cookie.setLocationRelativeTo(null);
cookie.setLayout(new FlowLayout() );
cookie.pack();
cookie.setVisible(true);
}
public static void main(String[] args) {
cookies();
}
}
编译时会返回:
cookieClicker.java:15: error: local variables referenced from an inner class must be final or effectively final
a++;
^
答案 0 :(得分:3)
关于您的问题:您需要将计数(a)存储在字段中,而不是存储在本地变量中。
但是你的代码显示了对事件和听众原则的巨大误解。您在创建JFrame后立即尝试获取点击次数,甚至在您将其显示之前。这是没有意义的。用户怎么能在那时点击按钮?您需要从侦听器本身更改标签的文本(而不是每次都添加新标签):单击按钮时,显示的文本会更改。这就是actionPerformed方法的作用:对点击按钮作出反应。
官方Swing tutorial有很多示例和解释显示
阅读它们,因为你真的没有以一种良好的方式做事。