可以使用 Swing Timer 以更优雅的方式完成吗?

Posted

技术标签:

【中文标题】可以使用 Swing Timer 以更优雅的方式完成吗?【英文标题】:Can it be done in a more elegant way with the Swing Timer? 【发布时间】:2015-06-12 17:21:33 【问题描述】:

下面是最简单的 GUI 倒计时代码。是否可以使用 Swing 计时器以更短、更优雅的方式完成相同的操作?

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountdownNew 

    static JLabel label;

    // Method which defines the appearance of the window.   
    public static void showGUI() 
        JFrame frame = new JFrame("Simple Countdown");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label = new JLabel("Some Text");
        frame.add(label);
        frame.pack();
        frame.setVisible(true);
    

    // Define a new thread in which the countdown is counting down.
    public static Thread counter = new Thread() 

        public void run() 
            for (int i=10; i>0; i=i-1) 
                updateGUI(i,label);
                try Thread.sleep(1000); catch(InterruptedException e) ;
            
        
    ;

    // A method which updates GUI (sets a new value of JLabel).
    private static void updateGUI(final int i, final JLabel label) 
        SwingUtilities.invokeLater( 
            new Runnable() 
                public void run() 
                    label.setText("You have " + i + " seconds.");
                
            
        );
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                showGUI();
                counter.start();
            
        );
    


【问题讨论】:

【参考方案1】:

是的,您应该使用摇摆计时器。您不应该使用 util Timer 和 TimerTask。

当 Swing Timer 触发时,代码在 EDT 上执行,这意味着您只需要调用 label.setText() 方法。

使用 uitl Timer 和 TimerTask 时,代码不会在 EDT 上执行,这意味着您需要将代码包装在 SwingUtilities.invokeLater 中以确保代码在 EDT 上执行。

这就是使用 Swing Timer 的方法比您当前的方法更短更优雅,它简化了编码,因为代码是在 EDT 上执行的。

【讨论】:

【参考方案2】:

是的,使用计时器。 updateGUI 将是计时器任务的代码,但它需要进行一些更改,因为您无法为每个调用传入 i,因为您只是获得了一个 run() 方法。

【讨论】:

【参考方案3】:

您可以通过使用Timer 和适当的TimerTask 使其更优雅。

【讨论】:

以上是关于可以使用 Swing Timer 以更优雅的方式完成吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swing Timer 来延迟进度条的加载

javax.swing.Timer的使用

Java Swing的计时器组件Timer

将 Swing Timer 与 gif 图像同步

坚持使用 Java Swing Timer

Swing事件监听