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

     2023-02-19     107

关键词:

【中文标题】如何使用 Swing Timer 来延迟进度条的加载【英文标题】:How to use the Swing Timer to delay the loading of a progress bar 【发布时间】:2013-03-18 02:47:34 【问题描述】:

我需要找到一种方法来使用带有进度条的摇摆计时器。我尝试使用 Thread.sleep(),但是当我使用它时它使应用程序崩溃。有什么方法可以使用 Swing Timer 而不是 Sleep()?

public void piiEros(int dist)

    Pii pii = new Pii();
    pii.setVisible(true);
    for(int pc = 0;100 > pc; pc++)
    
        try 
            Thread.sleep(dist/100);
         catch (InterruptedException ex) 
            Logger.getLogger(Trav.class.getName()).log(Level.SEVERE, null, ex);
        
        pii.pg.setValue(pc);
    
    pii.dispose();
    o.Eros();

注意:Pii 是一个带有进度条的类。 Dist 是它加载的速度。 Trav 是方法所在的类。Pc 代表 %,完成了多少会显示在条上。 o.Eros 打开另一个 GUI。

【问题讨论】:

对不起代码,空格只是删除自己。编辑:Eng Fouad 修复了缩进,谢谢! 这是一个更易读的代码:dropbox.com/s/402vcqi3ah4kcbn/ST%20PG.JPG 不要在美国东部时间睡觉!顺便说一句,说到进度条,请使用 SwingWorker。 使用 SwingWorker 可能更好 另见Getting my jProgressBar to run on a timer 【参考方案1】:

您可以通过这种方式更改您的piiEros 方法:

public void piiEros(int dist)

    final Pii pii = new Pii();
    pii.setVisible(true);
    javax.swing.Timer  timer = new javax.swing.Timer(dist/100, new ActionListener()
    
      public void actionPerformed(ActionEvent evt)
      
        pii.pg.setValue(pg.getValue()++);
        if ( pii.pg.getValue() > 100 )
        
          timer.stop();
          pii.dispose();
          o.Eros();
        
      
    );
    timer.setInitialDelay(0);
    timer.setRepeats(true);
    timer.start();

【讨论】:

(无需调用setDelay,你已经在构造函数中建立了;)) 是的,我想确保 ;) IDE 不喜欢在方法中调用 javax.swing.Timer 并且我之前总是添加要创建的对象的名称,所以现在看起来像这样:Timer timer = new Timer(dist/100, new ActionListener() Could'nt get your point..你的意思是你的 IDE 在看到 javax.swing.Timer 时在抱怨吗?【参考方案2】:

使用SwingWorker 可能更容易(从长远来看)。它提供了许多有用的方法来更新 UI(从事件调度线程的上下文中),同时允许在后台继续执行......

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestSwingWorker02 

    public static void main(String[] args) 
        new TestSwingWorker02();
    

    public TestSwingWorker02() 
        EventQueue.invokeLater(new Runnable() 
            @Override
            public void run() 
                try 
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                 catch (ClassNotFoundException ex) 
                 catch (InstantiationException ex) 
                 catch (IllegalAccessException ex) 
                 catch (UnsupportedLookAndFeelException ex) 
                

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            

        );
    

    public class TestPane extends JPanel 

        public TestPane() 
            setLayout(new GridBagLayout());
            JProgressBar pb = new JProgressBar();
            add(pb);

            new ProgressWorker(pb, 40).execute();
        

        @Override
        public Dimension getPreferredSize() 
            return new Dimension(200, 200);
        

    

    public class ProgressWorker extends SwingWorker<Void, Integer> 

        private int delay;
        private JProgressBar pb;

        public ProgressWorker(JProgressBar progressBar, int delay) 
            this.pb = progressBar;
            this.delay = delay;
        

        @Override
        protected void process(List<Integer> chunks) 
            // Back in the EDT...
            pb.setValue(chunks.get(chunks.size() - 1)); // only care about the last one...
        

        @Override
        protected Void doInBackground() throws Exception 
            for (int index = 0; index < 100; index++) 
                publish(index);
                Thread.sleep(delay);
            
            return null;
        

        @Override
        protected void done() 
            // Back in the EDT...
            //pii.dispose();
            //o.Eros();
        

    


SwingWorker 允许您分离逻辑。在doInBackground方法中你可以专注于需要在EDT之外运行的那部分代码,你可以将publish分别更新回EDT和process它们。当全部为done 时,您可以根据需要进行清理。

SwingWorker 还提供进度监控功能,因此,在您的情况下,如果您不想这样做,您就不必使用 API 的 publish/process 部分。这将允许您将PropertyChangeListener 附加到工作人员,而无需向其公开进度条。 (但我为示例做了)

public class ProgressWorker extends SwingWorker<Void, Integer> 

    private int delay;
    private JProgressBar pb;

    public ProgressWorker(JProgressBar progressBar, int delay) 
        this.pb = progressBar;
        this.delay = delay;
        // You can use a property change listener to monitor progress updates...
        addPropertyChangeListener(new PropertyChangeListener() 
            @Override
            public void propertyChange(PropertyChangeEvent evt) 
                if ("progress".equalsIgnoreCase(evt.getPropertyName())) 
                    pb.setValue((Integer)evt.getNewValue());
                
            

        );
    

    @Override
    protected Void doInBackground() throws Exception 
        for (int index = 0; index < 100; index++) 
            setProgress(index);
            Thread.sleep(delay);
        
        return null;
    

    @Override
    protected void done() 
        // Back in the EDT...
        //pii.dispose();
        //o.Eros();
    


【讨论】:

+1 现代和干净的答案..;) 。但是你不觉得SwingWorker对于这么小的任务来说是一个很大的任务。 就我个人而言,我觉得它更干净,更容易理解(但我就是这么简单) 我明白了..程序员自己的品味..;)

如何使用 swift 显示带有进度条的 AVAudioPlayer?

】如何使用swift显示带有进度条的AVAudioPlayer?【英文标题】:HowtoAVAudioPlayerwithprogressbarshowusingswift?【发布时间】:2019-01-2413:26:17【问题描述】:我正在使用AVAudioPlayer播放歌曲。我需要一个进度条来显示歌曲的进度。我的问题是... 查看详情

增加高度时如何平滑进度条的拐角?

】增加高度时如何平滑进度条的拐角?【英文标题】:Howtosmoothlyroundthecornersofaprogressbarwhentheheightisincreased?【发布时间】:2018-01-2618:08:38【问题描述】:我正在尝试制作这样的进度条:我使用这个SO帖子来学习如何圆角:Link当您... 查看详情

c#进度条怎么用/c#progressbar的用法

1.打开MicrosoftVisualStudio2010,新建名字为【进度条】的程序。2.在新程序界面上放置合适的控件:包括,日志输出文本框控件;用于输入进度条长度的输入框;3个进度条的控制按钮,可以分别开始、暂停或者停止进度条的进度;添... 查看详情

vc6.0里mfc进度条如何使用

参考技术A演练CProgress7.1进度条的主要功能进度条控制(ProgressControl)主要用来进行数据读写、文件拷贝和磁盘格式等操作时的工作进度提示情况,如安装程序等,伴随工作进度的进展,进度条的矩形区域从左到右利用当前活动... 查看详情

如何更改圆形进度条的颜色?

】如何更改圆形进度条的颜色?【英文标题】:Howtochangecolorincircularprogressbar?【发布时间】:2011-07-1707:03:54【问题描述】:我在Android上使用循环进度条。我想改变它的颜色。我正在使用"?android:attr/progressBarStyleLargeInverse"风格。那... 查看详情

如何在另一个外部类变量中分配进度条的值来执行计算?

】如何在另一个外部类变量中分配进度条的值来执行计算?【英文标题】:howtoassignthevalueofaprogressbarinanotherouterclassvariabletoperformcalculation?【发布时间】:2021-09-1410:14:28【问题描述】:所以我一直在尝试在androidstudio中制作这个BMI... 查看详情

javaawt如何延迟绘制对象

...,或者整个程序冻结了。使用Timer是个好主意吗?我应该如何实现它,使它工作?importjavax.swing.*;importjava.awt.*;importjava.util.Random;classWindowextendsJFrame{Randomrand=n 查看详情

javax.swing.timer的使用

以指定的间隔触发一个或多个ActionEvents。示例使用是使用Timer作为绘制其帧的触发器的动画对象。设置定时器包括创建一个Timer对象,在其上注册一个或多个动作侦听器,并使用start方法启动定时器。例如,下面的代码创建并启动... 查看详情

比较使用 Thread.Sleep 和 Timer 来延迟执行

】比较使用Thread.Sleep和Timer来延迟执行【英文标题】:CompareusingThread.SleepandTimerfordelayedexecution【发布时间】:2010-09-2808:14:35【问题描述】:我有一个方法应该延迟运行一段指定的时间。我应该使用Threadthread=newThread(()=>Thread.Sleep(... 查看详情

关于vb.net进度条的实例

...程序,让它每0.5秒进度增加1%,并用文本显示当前的进度,该如何实现?该实例有很多实现方法,下面介绍一种不同的给你:首先要在窗体中载入以下控件:progressbar(进度条),label(用来实时显示文本提示),两个timer(分别控制进度条进度的增... 查看详情

关于vb.net进度条的实例

...程序,让它每0.5秒进度增加1%,并用文本显示当前的进度,该如何实现?这是我自己写的一个进度条控件,如图:边框粗细和边框颜色以及进度条颜色都可以调。进度条大小你可以自己拉伸。同时,进度条还提供了丰富的动画效果(如... 查看详情

如何实现带有进度条的启动画面? - 安卓

】如何实现带有进度条的启动画面?-安卓【英文标题】:Howtoimplementasplashscreenwithaprogressbar?-android【发布时间】:2012-06-1722:46:32【问题描述】:我在启动时有一个启动画面。使用以下编码publicclassSplashextendsActivity@Overrideprotectedvoido... 查看详情

如何更改进度条的位置 - 多处理

】如何更改进度条的位置-多处理【英文标题】:Howtochangepositionofprogressbar–multiprocessing【发布时间】:2017-07-1700:20:56【问题描述】:首先,我是Python新手。与问题无关,但我不得不提一下。我正在创建一个爬虫作为我的第一个项... 查看详情

如何更改 SWT 进度条的颜色?

】如何更改SWT进度条的颜色?【英文标题】:HowtochangecolorofSWTprogressbar?【发布时间】:2014-06-1203:44:18【问题描述】:是否可以使用绘制侦听器更改进度条颜色?我不想要一个初始前景色和背景色,而是希望它像正常的绿色进度条... 查看详情

控制进度条的粗细

...】:我有一个进度条,如下所示:我的问题很简单,我将如何控制圆形视图的“厚度”,因为在我看来它似乎太厚了。非常感谢。【问题讨论】:使用自定义进度对话框,我的意思是你可以使用自己的图像,否则你无法控制默认... 查看详情

Tkinter:如何使用线程来防止主事件循环“冻结”

】Tkinter:如何使用线程来防止主事件循环“冻结”【英文标题】:Tkinter:Howtousethreadstopreventingmaineventloopfrom"freezing"【发布时间】:2013-05-2016:14:54【问题描述】:我有一个带有“开始”按钮和进度条的小型GUI测试。期望的... 查看详情

如何使用计时器等待?

】如何使用计时器等待?【英文标题】:Howtouseatimertowait?【发布时间】:2012-12-1701:19:46【问题描述】:我试图通过使用计时器来延迟我的方法中的事件,但是我不一定了解如何使用计时器来等待。我将计时器设置为2秒,但是当... 查看详情

如何在 Swing 中创建延迟

】如何在Swing中创建延迟【英文标题】:HowtocreateadelayinSwing【发布时间】:2011-11-0706:34:55【问题描述】:我做了一个二十一点游戏,我希望AI玩家在拿牌之间暂停一下。我尝试简单地使用Thread.sleep(x),但这会使其冻结,直到AI玩家... 查看详情