当前位置: 首页 > 知识库问答 >
问题:

在Java的Swing GUI中使用线程

边永贞
2023-03-14

我使用以下代码,每0.5秒用相同的句子,但用另一个点替换一个JLabel。

    Runnable r1=new Runnable() {
        @Override
        public void run() {
            while(true){
                try {
                    connectionStatus.setText("Connection Established...");
                    Thread.sleep(500L);
                    connectionStatus.setText("Connection Established.");
                    Thread.sleep(500L);
                    connectionStatus.setText("Connection Established..");
                    Thread.sleep(500L);
                } catch (InterruptedException ex) {

                }
            }
        }
    };
Thread th1=new Thread(r1);
th1.start();

这是使用线程的真正目的吗?这会影响程序的速度吗?如果我正在做的事情是如此愚蠢,有没有其他方法可以做这样愚蠢的事情?

共有3个答案

秦才英
2023-03-14

尝试使用Swing库中的计时器。通常,最好将这些用于GUI相关的任务。当您尝试在多个组件上使用定时事件时,这将特别有用,因为所有计时器共享同一个计时器线程。

它还提供了基于侦听器的灵活直观的编程模型。

不需要重新发明轮子。

计时器教程

编辑:

对车轮改造部分进行了一点跟进。你也应该考虑安德鲁·汤普森的建议。Swing中有一些组件是专门为指示进度而设计的。没有必要像你试图做的那样使用标签。看看JProgressBar。这将是简单的,它会看起来更专业。

步博厚
2023-03-14

这段代码有几个问题。

  1. Swing组件应在事件调度线程上访问/更新,并且不是线程安全的。因此,启动另一个线程来更新您的JLabel根本没有完成。有关更多信息,请参阅“Swing中的并发”教程
  2. 即使您在EDT上调用上面的代码,您也不会看到JLabel的任何更新,因为Thread.sleep会阻塞EDT,并避免重新绘制。

因此,解决方案是使用javax。摆动定时器类,它允许定期对EDT执行操作,并且不会在两者之间阻塞EDT。另请参阅计时器教程。作为一种副作用,使用计时器可以避免永远不会结束的while(true)循环。

你可以在这里找到更完整的答案。

朱锦
2023-03-14

这是使用线程的真正目的吗?

如果您希望这些操作并行运行,那么答案是肯定的

有没有其他方法可以做这样愚蠢的事情?

如果你更新你的标签在一个固定的时间间隔然后你可能应该去使用定时器而不是

另一方面:

  • 您应该避免使用,而(true)在进行多线程时,您应该定义一个在循环中测试的停止布尔值,或者在扩展Thread类时使用Thread.interrupted()
  • 从非EDT线程更新UI元素时,应该使用SwingUtilities.invoke稍后
 类似资料:
  • 我一直试图使这个应用程序,将产生一个折线图后,我点击"添加新数据项"按钮。现在,在我点击按钮后,什么都没发生(gui冻结),在我最大化框架后,图形出现在框架内,这意味着我的程序工作了,但我不知道为什么我的gui冻结了。我见过类似的问题,人们回答说必须引入一个新的线程来处理不同的拍摄,我也尝试过,但它仍然不起作用,只是让情况变得更糟。有人知道我犯了什么错误吗?这是我的代码: 谢谢你!

  • 问题内容: 我有一个多线程Java应用程序,该应用程序会将有关它收到的消息的信息输出到控制台以进行调试。每次应用程序收到消息时,它将在消息上调用。 我遇到的问题是,如果应用程序被消息淹没,则会打印错误信息(例如旧缓冲区信息)。这使我想知道是否存在线程问题,即多个线程一次调用该函数,而没有正确刷新缓冲区。 在我的主程序(线程)中,我有以下效果: 在我的线程中,我有以下效果: 是否有一种简单的方法可以

  • 问题内容: 我想使用它的ID终止线程。 使用下面的语句我得到线程。我正在维护的该线程ID ,但是每当使用要终止该线程时,我就有可能使用线程ID终止。 我该如何实现? 问题答案: 你可以这样

  • 问题内容: 我正在编写一个具有许多不同视图的程序。其中之一是图形密集型(显示互连的图形)。其他人只显示较小但复杂的图表。 我发现主视图的绘制时间很长(甚至只是绘制当前可见的区域),并且在绘制时,界面的其余部分变得很慢。 我的问题是,我可以创建一个新线程来处理绘画吗?如果是这样,是否会导致性能提高,我怀疑它不会。我尝试了以下方法: 创建一个抽象类ThreadPaintablePanel,我的复杂视图

  • 问题内容: 有人可以帮助我了解什么是Java 以及何时使用它吗? 对于该程序的工作方式,我没有一个很清楚的想法。据我了解,所有三个线程同时启动,每个线程将在3000ms之后调用CountDownLatch。因此,递减计数将逐一递减。锁存器变为零后,程序将打印“ Completed”。也许我的理解方式不正确。 // ------------------------------------------

  • 本文向大家介绍在spring boot中使用java线程池ExecutorService的讲解,包括了在spring boot中使用java线程池ExecutorService的讲解的使用技巧和注意事项,需要的朋友参考一下 1. 认识java线程池 1.1 在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.需处理的任务的数量大 1.2 使用线程池的好处: 1.减少在创建和销毁线程上所花的