Java Swing如何使这个计数器工作?

时间:2011-04-01 11:52:41

标签: java swing counter toolkit

每当我的计数器达到4时,我希望它发出哔哔声并返回“1”并再次计数4次播放哔声等等。

我可能不应该把它放在标签上,因为计数器根本不运行! 标签上写道,我没有任何错误;计数器是4并且不计数或任何东西。

你能帮我把这个计数器正常工作吗?我也用过printline 也犯了一些错误。

我的柜台代码是:

button1.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent arg0) {

    label1.setVisible(true);
    int counter = 1;

    while(counter < 5 )
    {
      label1.setText("counter  is " + counter);
      counter = counter + 1 ;
    }

    counter = 1;
    tk.beep();
  }
});

5 个答案:

答案 0 :(得分:5)

生成一个新线程来计算,等待和更新GUI。

您正在Event Dispatch Thread中完成所有这些工作,这是唯一更新GUI的线程。因此,当您设置标签的文本时,它不会在屏幕上更新,直到方法返回并且事件调度线程处理重绘操作。

您需要生成一个新线程才能执行此操作,而不是仅在立即执行的循环中运行它。只需让actionPerformed方法生成一个新的Thread来代替它。在此线程中循环,计数和更新,在更新之间等待Thread.sleep。要更新标签文本,请创建一个新的Runnable,它将标签更新为下一个值,并将其放在带有SwingUtilities.invokeLater的事件调度线程上。保持此线程在后台运行,直到您需要它为止。我建议每次循环检查关闭状态boolean,并在设置为false时退出。这样,您可以随时干净地关闭线程。或者,如果你想让它倒计时并且只发出一次哔哔声,那么你可以在一次迭代计数之后让线程结束。

Stack Overflow上有很多关于每个步骤的问题,所以我不会在这里重复这些信息。

答案 1 :(得分:1)

更改值后需要重新绘制。此外,我假设您实际上想要计算秒数,在这种情况下您需要使用Timer来启动更改标签和可能播放声音的操作。

答案 2 :(得分:1)

也许这就是你所设想的,每按一下按钮就会重置并发出哔哔声

loginButton.addActionListener(new java.awt.event.ActionListener() {

    int counter = 1;

    public void actionPerformed(ActionEvent arg0) {

        label1.setVisible(true);

        if (counter < 5) {
            label1.setText("counter  is " + counter);
            label1.repaint();
            ++counter;
        } else {
            counter = 1;
            tk.beep();
        }
    }
});

答案 3 :(得分:1)

如果我理解你想要的是什么,下面的代码应该可以实现你的目标。

button1.addActionListener(new ActionListener() {

  public void actionPerformed(ActionEvent arg0) {

    label1.setVisible(true);

    Runnable runnable = new Runnable() {
           int counter =1 ;

           public void run() {
               while(true) {

                    while (counter<5)  {
                        SwingUtilties.invokeLater(new Runnable() {
                               public void run() {
                                   label1.setText("counter  is " + counter);
                               }
                        }); 

                        counter = counter + 1 ;
                        try {
                           Thread.sleep(1000);
                        }catch(InterruptedException ex) {
                            System.err.println(ex.toString());

                        }    
                    } 
                counter = 1;
                tk.beep();

                }

           }
    };

     new Thread(runnable).start();

});

答案 4 :(得分:0)

你的循环在前4个循环后停止,从未再次调用。由于文本正在变为快速,因此您只能看到最后的结果

int counter = 0;
while (//when do you want it to stop?)
{
    // print what you want (using (counter % 4) + 1)
    if ((counter % 4) == 0)
    {
         tk.beep();
    }
}