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

时间:2015-04-08 20:16:55

标签: java swing

该程序冻结,因为我在动作监听器中为祖母按钮设置了循环。我知道为什么它不起作用,但我似乎无法找到解决方法。任何人都可以告诉我它。

我是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");

    }


}

1 个答案:

答案 0 :(得分:3)

  

在这个程序中,有一个可以工作的cookie按钮,以及一个应该触发while循环的祖母按钮,它将每隔5秒添加一个cookie。::

不要在ActionListener中使用循环。循环阻止事件调度线程并阻止GUI重新绘制自己。

相反,您应该使用Swing Timer

阅读Swing Tutorial上的部分:

  1. Concurrency in Swing
  2. How to Use Timers
  3. 了解更多信息。

    此外,变量名称不应以大写字符开头。有时你的名字是正确的,有时他们不是。保持一致!!!

    摆脱所有空白。如果要发布供人们阅读的代码,请使用正确的格式。现在,发布的代码很难阅读。

相关问题