可能不使用计时器

时间:2016-04-04 01:31:13

标签: java swing timer thread-sleep

大家好我想问一下是否有可能不使用Java netbeans中的计时器在我的JLabel上使用while循环显示我的变量“counter”的所有值。这是我的示例代码。

int counter = 0;

while (counter < 10)  {
    lblDisplay.setText("Completed " + Integer.toString(counter));
    try {
        Thread.sleep(1000);
        lblDisplay.setText("Completed " + Integer.toString(counter));
    } catch (InterruptedException ex) {
        Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
    }
    counter++;
}

在使用system.out.println时它显示但是在我的Label中没有。

1 个答案:

答案 0 :(得分:3)

是的,可以避免使用Swing Timer来实现这一目标,但如果你这样做了,那么:

  • 您必须确保循环和Thread.sleep(...)在Swing事件线程的后台线程中运行。如果不这样做,您将冻结事件线程,从而冻结GUI并使其无效。
  • 然后你必须确保当你只从后台线程进行Swing调用时,你会花费很多时间将这些调用排入Swing事件调度线程。如果不这样做,您将面临偶尔很难调试线程错误的风险。

由于所涉及的额外工作和错误的风险,你会发现只使用Swing Timer它 更简单,更安全。例如,您发布的代码看起来很有可能将整个GUI /应用程序置于睡眠状态,因为它既有一个while循环又一个Thread.sleep(...)被调用,而不用考虑线程。

例如,如果没有Timer,您的代码可能看起来像(警告:代码未编译或测试):

new Thread(new Runnable() {
    public void run() {
        int counter = 0;

        while (counter < 10)  {
            lblDisplay.setText("Completed " + Integer.toString(counter));
            try {
                Thread.sleep(1000);
                final int finalCounter = counter;
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        lblDisplay.setText("Completed " + finalCounter);
                    }
                });
            } catch (InterruptedException ex) {
                Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
            }
            counter++;
        }    
    }
}).start();

这比我喜欢的要复杂一点,而Swing Timer可能看起来像:

int delay = 1000;
new Timer(delay, new ActionListener() {
    private int count = 0;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (count < 10) {
            lblDisplay.setText("Completed " + counter);
        } else {
            ((Timer) e.getSource()).stop(); // stop the Timer
        }
        counter++;
    }
}).start();

这比以前更简单,更安全。