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

如何每次使用while循环延迟更新jLabel

习阳
2023-03-14
问题内容
   private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
  int count = jSlider1.getValue(); 
  int delay = jSlider2.getValue();
    int valueOfSlider = jSlider2.getValue();
     int valueOfSlider2 = jSlider1.getValue();

while (count > 0) 
{ 
    count--;
    String count2 = ""+count; 
  jLabel3.setText(count2);
try {Thread.sleep(delay); }
catch (InterruptedException ie) { }

 }

最终它将在jLabel上显示最终编号,但不会递增更新编号。任何帮助


问题答案:

Swing是单线程的 。因此, 长时间运行的任务绝不应在EDT中进行
。这包括睡觉。而是使用javax.swing.Timer。这将在后台线程中延迟,然后发布要在EDT中执行的操作。

也可以看看:

  • 如何使用摇摆计时器
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public final class JLabelUpdateDemo {

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run() {
                createAndShowGUI();             
            }
        });
    }

    private static void createAndShowGUI(){
        final JFrame frame = new JFrame("Update JLabel Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(JTimerLabel.getInstance());
        frame.setSize(new Dimension(275, 75)); // used for demonstration purposes
        //frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        Timer t = new Timer(1000, new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                int val = Integer.valueOf(JTimerLabel.getInstance().getText());
                JTimerLabel.getInstance().setText(String.valueOf(++val));
            }
        });
        t.start();
    }

    private static final class JTimerLabel extends JLabel{
        private static JTimerLabel INSTANCE;

        private JTimerLabel(){
            super(String.valueOf(0));
            setFont(new Font("Courier New", Font.BOLD,  18));
        }

        public static final JTimerLabel getInstance(){
            if(INSTANCE == null){
                INSTANCE = new JTimerLabel();
            }

            return INSTANCE;
        }
    }
}

该SSCCE模仿一个计数器,该计数器从0每秒开始计数(即更新JLabel实例),直到应用程序终止。



 类似资料:
  • 如何在不停止主GUI线程的情况下停止循环?(线程。睡眠(1000)未工作)

  • 我在试着理解为什么一些简单的环路会以这样的速度运行 第一种情况: 根据IACA,吞吐量是1个周期,瓶颈是端口1,05。我不明白为什么它是1 cylce。毕竟我们有两个循环承载的依赖关系: 而且这种Latency是循环进行的,所以它应该会减慢我们的迭代。 第二种情况: 我更不明白为什么吞吐量是1.65。

  • 问题内容: 我正在尝试提高SQL编程的效率。我正在尝试运行一个循环,以对仅按数字后缀更改的字段名称重复执行更新命令。 例如,而不是写出来,然后每次更新: 让我知道是否可以澄清。我正在使用SQL Server 2005。 感谢您的指导。 我正在尝试应用Adams的解决方案,并且需要了解以下N’的正确用法: 问题答案: 这实际上将不起作用,因为您不能在列名中加上引号。您实际上要做的是让SQL比较两个始

  • 问题内容: 我想在循环内添加延迟/睡眠: 我这样尝试过: 只有第一种情况是正确的:显示后,它将等待3秒钟,然后显示,但随后将不断重复。 我想要的是在显示3秒之后显示出来,然后它需要第二次等待3秒,依此类推。 问题答案: 该函数是非阻塞的,将立即返回。因此,您的循环将非常快速地迭代,并且将快速连续地发起3秒超时触发。这就是为什么您的第一个警报会在3秒钟后弹出,而其余所有警报都将连续不断地出现。 您可

  • 我正在尝试使用Postman来验证API。我可以毫无问题地验证单个请求,并获得所需的输出。但是,我现在想进行负载测试,并运行相同的调用5次。 我尝试使用for和while循环,但是Postman给出了一个错误。

  • 我正在做一个双人骰子游戏,有五轮,但是我想保持前几轮的分数不变,我该怎么做? 游戏规则如下: 每个玩家骰子上滚动的分数会加到他们的分数上。如果总数是偶数,他们的分数会增加10分。如果总数是奇数,他们的分数会减去5分。如果他们掷出双倍,他们会多掷一个骰子,并将滚动的分数加到他们的分数上。玩家的分数在任何时候都不能低于0。在5轮结束时得分最高的人获胜。如果两个玩家在5轮结束时得分相同,他们每人投1个死