当前位置: 首页 > 面试题库 >

如何在Java Swing应用程序中暂停/睡眠/等待?

卞轶
2023-03-14
问题内容

我正在使用JLabel创建动画,

public void updateLabels() {
      label.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imageCALA,300,300)));
      label_1.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imageStates,300,300)));
      label_2.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imageStrategies,300,300)));
      label_3.setIcon(new ImageIcon(new Paint().getScaledImage(paint[currentIndexLabel].imagekD,300,300)));

      currentIndexLabel++;
}

我有一个按钮可以更新标签

btn.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        while (currentIndexLabel != paint.length-1) {
            updateLabels();
        }
    }
});

但是,我不知道如何等待(例如1000毫秒)直到下一次更改。当我添加此:

try { Thread.sleep(1000); } catch (Exception e){}

到我的ActionListener中:

btn.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent arg0) {
           while (currentIndexLabel!=paint.length-1) {
             updateLabels();
             try { Thread.sleep(1000); } catch (Exception e){}
       }
    }
 });

它不起作用。它停了片刻,我看不到第一帧和最后一帧之间的变化。是否可以等待1000毫秒而不停止程序?当我删除while循环并尝试部分时,单击我的按钮,它的变化非常好…

我怎样才能做到这一点?


问题答案:

Thread#sleep 线程中的swing应用程序中使用method
会导致GUI冻结(因为该线程处于睡眠状态,因此无法发生事件)。Thread#sleepSwing应用程序中的Swing方法仅允许SwingWorkers使用,并且只能在其#doInBackround方法中使用。

为了在Swing应用程序中等待(或定期执行某些操作),您将必须使用Swing计时器。看我做的一个例子:

import java.awt.FlowLayout;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer; //Note the import

public class TimerExample extends JFrame {
    private static final int TIMER_DELAY = 1000;
    private Timer timer;

    public TimerExample () {
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(200, 200);
        setLocationRelativeTo(null);
        getContentPane().setLayout(new FlowLayout());

        timer = new Timer(TIMER_DELAY, e -> {
            System.out.println("Current Time is: " + new Date(System.currentTimeMillis()));
        });
        //timer.setRepeats(false); //Do it once, or repeat it?
        JButton button = new JButton("Start");
        button.addActionListener(e -> timer.start());
        getContentPane().add(button);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new TimerExample().setVisible(true));
    }
}

按下“开始”按钮后的输出:

当前时间是:2019年2月25日星期一13:30:44

当前时间是:EET 2019星期一2月25日13:30:45

当前时间是:EET 2019星期一2月25日13:30:46

如您所见,Timer的动作侦听器每秒触发一次。

因此,在您的情况下:

timer = new Timer(TIMER_DELAY, e -> {
    if (currentIndexLabel != paint.length-1) {
        upateLabels();
        timer.restart(); //Do this check again after 1000ms
    }
});
button.addActionListener(e -> timer.start());


 类似资料:
  • 我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程

  • 我有一个要求,我需要采取我的一些文件的副本,并把它放在内部服务器。这需要定期发生,比如每天晚上8点。这也是一个Swing应用程序,在我的本地PC上运行。我知道我可以使用Java计划任务,或者使用,或者更好的。 但是,问题来了。没有人会仅仅为了这个调度器就让计算机开机24小时。据我所知,如果有人重启电脑,Java调度器也会死掉。相反,一旦任务计划完成,如果计算机已打开,则计划的任务应在每天晚上8点进

  • 我认为Azure的优点之一是,我可以根据我希望服务何时可用来打开和关闭服务。 然而,我看不到如何暂停我的应用程序服务计划。有可能吗? 我想使用S1层,这样我就可以使用它提供的东西。然而,当我不使用它时,我希望能够暂停成本积累。 我从应用程序服务定价帮助中看到,即使某个应用程序处于停止状态,仍将为其计费。 然而,这种联系也清楚地表明,我只为我使用的东西付费。那么这是如何运作的呢?

  • 这里的要点是了解实现等待循环的更有效的解决方案,该循环在每次迭代时轮询条件。通过高效,我的意思是“有效的CPU调度”。 我知道代码中使用的等待条件不是“wakeOne”/“wakeAll”指令中使用的“真正的等待条件”,但我想知道对CPU来说,使用假等待条件是否比睡眠更有效。 这里有2个代码片段,它们做同样的事情:等待某些事情发生。这段代码用于工作线程池。因此,当一个线程等待时,其他线程(或其他一

  • 问题内容: 我正在用Java编写一个简单的钓鱼模拟器游戏。我希望每次投射后都有一个随机生成的等待时间。等待结束后,将发生随机事件(一条鱼将被捕获,一条鱼将使您的鱼饵变硬,等等)。我听说过有关Thread.sleep()的坏事,并且想知道在这种情况下最适合我的方法。 目前我正在使用这样的东西 问题答案: 您可以考虑使用SwingTimer。 看看这个[类似的帖子](http://codingdict

  • 问题内容: 这段代码: 使我的计算机挂起5秒钟,然后打印出0-9,而不是每半秒打印一次数字。难道我做错了什么? 问题答案: ,默认情况下,在内部打印到并缓冲要打印的输出。 通常是否由文件确定输出是否被缓冲,但是如果关键字参数为true,则将强制刷新流。 在版本3.3中更改:添加了关键字参数。 报价文件, 交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样被块缓冲。 因此,就您而言,您需要像这