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

我的GUI冻住了

黄锋
2023-03-14

我有点不明白:我的Swing GUI包含一个“播放”和“暂停”按钮。我还有一个静态变量,定义“开”和“关”状态。(主程序生成GUI)。通过点击“play”,我将静态变量的状态更改为“on”,并在一个线程中启动一个耗时的过程,该线程也会修改GUI。只要静态变量在同一进程中“开启”循环。单击“暂停”会将静态变量更改为关闭。但通过点击“播放”,GUI会冻结,因此:

  1. GUI不更新
  2. 我的暂停按钮无法暂停进程。

我听说过EDT和SwingWorker,但我想你有一个简单的方法。

谢谢你的帮助,原谅我糟糕的英语...

共有3个答案

羊舌源
2023-03-14

你不应该在Swing的事件处理程序中启动长时间运行的进程,因为它会冻结你的图形用户界面,你现在知道了。:)在一个新线程中启动它。如果你打算从工作线程操作图形用户界面,你只需要使用一个<代码>SwingWorker(因为Swing不是线程安全的)。

江宏深
2023-03-14

您需要阅读Swing中的并发性,以了解EDT和SwingWorkers是如何操作的。

所有GUI更新都在EDT上执行,因此当您单击GUI组件时,此调用的任何方法都将在EDT上执行。如果这是一个耗时的过程,那么这将阻止EDT执行任何进一步的GUI更新。因此,您的GUI处于冻结状态,无法单击暂停按钮。

您需要使用SwingWorker在另一个线程上执行耗时的进程。我在上面提供的链接详细介绍了如何做到这一点。

屈俊远
2023-03-14

问题是,在负责更新GUI的同一个线程上,您正在进行密集、耗时的工作。SwingWorker允许您将耗时的任务移动到单独的执行线程,从而让UI线程不受限制地完成任务。

然而,它确实增加了另一个复杂性:亲和力。在UI组件上调用方法通常需要从UI线程执行。因此,需要使用特殊功能从工作线程返回UI线程。SwingWorker也给了你这种能力。

我建议你仔细阅读这份文件。

 类似资料:
  • 我是python新手,制作了一个Tkinter应用程序,当按下开始按钮时,它将执行目录中存在的所有python文件。我的GUI也有progressbar来查看当前的进度。 这是我的代码 但我的问题是,每当我按下开始按钮,GUI就会冻结,代码开始编译,完成后,GUI就会解冻,Progressbar会立即填满自己。。。 因此,我希望GUI在处理时不要冻结,并在Progressbar上显示正确的进度。

  • 我是Swing的新手,所以这似乎是一个非常天真的问题。 我有一个JFrame,它显示一个初始语句和两个单选按钮。RadioButton1表示接受,RadioButton2表示拒绝。如果用户选择接受,程序将继续。因此,我为Accept创建了一个ActionListener,以便我的其余代码都在这个ActionListener中。然而,只要用户按下Accept,GUI就会冻结。按Reject键只是程序

  • 问题内容: 我有一个Gui应用程序,它可以在串行热敏打印机上打印票证。当我点击启动此操作的按钮时,我的GUI被冻结。我认为这是因为代码是在EDT上执行的。我用jstack来确定,但是我不明白下面的结果: 有人可以告诉我在哪里可以看到我的GUI由于第一个线程“ Thread-12”而被冻结。 其次,只要我确定我只运行过一次该线程,“ Thread-6”和“ Thread-7”之间有什么区别。 问题答

  • 我正在开发一个用于指纹读取器的Android应用程序,我的操作包括验证用户指纹(连续),以及注册新指纹(从Web API获取指纹)。我正在使用Morpho MSO 1300指纹读取器。 当我运行我的应用程序时,我不断收到以下logcat消息 01-02 11:19:48.910 5286-11417/com.cms.attendance D/dalvikvm: GC_FOR_ALLOC释放 293

  • 问题内容: http://i.stack.imgur.com/XvHm5.png 当我单击“打开”按钮时,它将开始在JTextField上发送垃圾邮件1。而是冻结整个GUI,包括关闭按钮。我正在使用while循环,当您再次单击jButton时,它将停止。因为jButton被冻结,所以我无法停止该程序。我已经读过线程和多线程将有所帮助,但是所有教程都太复杂了,以至于我无法理解。他们说将循环和GUI放

  • 问题内容: 我知道此问题是由主线程上的sleep或wait调用引起的,有关如何解决此问题的答案是将方法放入单独的线程中,然后使该线程进入休眠状态。但是代码是一团糟,真的没有时间将其整理出来并分成单独的线程,并且想知道是否还有其他方法可以做到这一点?即使这不是使用GUI的最干净或最常见的做法。我只需要从方法中暂停一秒钟。 问题答案: 不创建单独的线程就无法做到这一点。用Java创建线程很容易。唯一要