该程序冻结,因为我在动作监听器中为祖母按钮设置了循环。我知道为什么它不起作用,但我似乎无法找到解决方法。任何人都可以告诉我它。
我是Java的新手,并且练习我正在制作一个cookie Clicker游戏。如果您不知道cookie点击器是什么,它本质上是一个游戏,您单击按钮以获取更多cookie,然后使用cookie购买更多自动生成cookie的项目。在这个程序中,有一个可以工作的cookie按钮,以及一个应该触发while循环的祖母按钮,它将每隔5秒添加一个cookie。
public class conn extends JFrame {
public int cookies;
//public int cps;
public int grandmas;
public int pg;
JButton ck;
JButton bgrandma;
//JTextArea cpslog;
JTextArea Cookies;
//JTextArea amount;
conn() {
super("");
setLayout(new BorderLayout());
JFrame scree = new JFrame();
pg = pg + 10;
ck = new JButton("Cookie");
add(ck, BorderLayout.CENTER);
ck.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
cookies++;
Cookies.setText(null);
Cookies.setEditable(false);
Cookies.append( cookies + " Cookies");
}
});
Cookies = new JTextArea();
add(Cookies, BorderLayout.PAGE_START);
bgrandma = new JButton("Buy a Grandma(" + pg + ")");
add(bgrandma, BorderLayout.WEST);
bgrandma.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(cookies >= pg) {
grandmas++;
//cps++;
//cps++;
cookies = cookies-pg;
Cookies.setText(null);
Cookies.append(cookies + " Cookies");
}
while(grandmas > 0) {
cookies++;
Cookies.setText(null);
Cookies.append(cookies + " Cookies");
try {
Thread.sleep(5000 / grandmas);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
setVisible(true);
setSize(600, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Cookie Clicker");
}
}
答案 0 :(得分:3)
在这个程序中,有一个可以工作的cookie按钮,以及一个应该触发while循环的祖母按钮,它将每隔5秒添加一个cookie。::
不要在ActionListener中使用循环。循环阻止事件调度线程并阻止GUI重新绘制自己。
相反,您应该使用Swing Timer
阅读Swing Tutorial上的部分:
Concurrency in Swing
How to Use Timers
了解更多信息。
此外,变量名称不应以大写字符开头。有时你的名字是正确的,有时他们不是。保持一致!!!
摆脱所有空白。如果要发布供人们阅读的代码,请使用正确的格式。现在,发布的代码很难阅读。