Java 当我在动作侦听器中放入while循环时,程序冻结

Java 当我在动作侦听器中放入while循环时,程序冻结,java,swing,Java,Swing,程序冻结是因为我在grandma按钮的动作侦听器中设置了一个循环。我知道为什么它不起作用,但我似乎找不到解决方法。有人能告诉我这件事吗 我是Java新手,为了练习,我正在制作一个饼干点击游戏。如果你不知道cookie clicker是什么,那么它本质上就是一个游戏,你可以点击一个按钮获取更多的cookie,然后使用cookie购买更多自动生成cookie的物品。在这个程序中,有一个cookie按钮可以工作,还有一个grandma按钮可以触发while循环,每5秒添加一个cookie 公共类连接扩

程序冻结是因为我在grandma按钮的动作侦听器中设置了一个循环。我知道为什么它不起作用,但我似乎找不到解决方法。有人能告诉我这件事吗

我是Java新手,为了练习,我正在制作一个饼干点击游戏。如果你不知道cookie clicker是什么,那么它本质上就是一个游戏,你可以点击一个按钮获取更多的cookie,然后使用cookie购买更多自动生成cookie的物品。在这个程序中,有一个cookie按钮可以工作,还有一个grandma按钮可以触发while循环,每5秒添加一个cookie

公共类连接扩展JFrame{
公共信息;
//公共信息系统;
公共int祖母;
公共int pg;
JButton-ck;
杰布顿·布格朗玛;
//jtextlog;
jtextareacookies;
//面积金额;
康涅狄格州{
超级(“”);
setLayout(新的BorderLayout());
JFrame scree=新的JFrame();
pg=pg+10;
ck=新的JButton(“Cookie”);
添加(ck,BorderLayout.CENTER);
ck.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
cookies++;
Cookies.setText(空);
Cookies.setEditable(false);
Cookies.append(Cookies+“Cookies”);
} 
});
Cookies=新的JTextArea();
添加(Cookies,BorderLayout.PAGE_START);
bgrandma=newjbutton(“买一个奶奶(+pg+”);
添加(bgrandma,BorderLayout.WEST);
bgrandma.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
如果(cookies>=pg){
奶奶++;
//cps++;
//cps++;
cookies=cookies pg;
Cookies.setText(空);
Cookies.append(Cookies+“Cookies”);
} 
而(祖母>0){
cookies++;
Cookies.setText(空);
Cookies.append(Cookies+“Cookies”);
试一试{
线程。睡眠(5000/奶奶);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}   
});
setVisible(真);
设置大小(600600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle(“饼干点击器”);
}
}
在这个程序中,有一个cookie按钮可以工作,还有一个grandma按钮可以触发while循环,每5秒添加一个cookie:

不要在ActionListener中使用循环。循环会阻止事件分派线程,并阻止GUI重新绘制自身

相反,您应该使用
摆动计时器

请阅读以下内容中的章节:

  • Swing中的并发性
  • 如何使用计时器
  • 了解更多信息

    此外,变量名不应以大写字符开头。有时你的名字是对的,有时是不对的。保持一致


    把所有的空白都处理掉。如果您想发布代码供人们阅读,请使用正确的格式。现在发布的代码读起来一团糟。

    胡乱猜测:你想要一个javax.swing.Timer随着时间的推移更新你的游戏,我打赌问题在于循环中的睡眠。其他时候我都看到这个问题,它是一个循环中的等待/睡眠/暂停问题。为什么5年后你会不接受答案?那条建议当时很好,现在仍然适用。