定期更新 SWT 会导致 GUI 冻结

2024-05-18

Problem:当 GUI 字段定期更新时,SWT 会冻结。

我想要一个基于 SWT 的 GUI,其中文本字段的值会定期递增。

  1. 最初我从单独的线程访问 textField 导致抛出异常:

线程“Thread-0”org.eclipse.swt.SWTException 中出现异常:无效 org.eclipse.swt.SWT.error(SWT.java:4533) 处的线程访问 org.eclipse.swt.SWT.error(SWT.java:4448) 在 org.eclipse.swt.SWT.error(SWT.java:4419) 在 org.eclipse.swt.widgets.Widget.error(Widget.java:482) 在 org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:373) 在 org.eclipse.swt.widgets.Text.setText(Text.java:2311) 在 regreon.Incrementing.lambda$0(Incrementing.java:62) 在 java.lang.Thread.run(Thread.java:745)

  1. 阅读 SWT 文档后(感谢@marko-topolnik) - 我尝试使用display.SyncExec(Runnable r) or display.AsyncExec(Runnable r)与调用的可运行程序Thread.sleep在循环。但这导致了整个事情都冻结了。这是代码:

    包装任何东西; 导入 org.eclipse.swt.widgets.Display; 导入 org.eclipse.swt.widgets.Shell; 导入 org.eclipse.swt.widgets.Text; 导入 org.eclipse.swt.SWT;

    公共类 FreezingGUI {

    protected Shell shell;
    private Text text;
    
    public static void main(String[] args) {
        try {
            FreezingGUI window = new FreezingGUI();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
    
        // HOW TO DO THAT???
        display.syncExec(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    Integer i = Integer.parseInt(text.getText()) + 1;
                    text.setText(i.toString());
                }
            }
        }
        );
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }
    
    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("SWT Application");
    
        text = new Text(shell, SWT.BORDER);
        text.setEditable(false);
        text.setText("0");
        text.setBounds(30, 32, 78, 26);
    }
    

    }

如何避免冻结和抛出异常?


任何更改 UI 对象的 SWT 操作都必须在 SWT 用户界面线程上运行。

在你的情况下text.setText(i.toString());line 是一个 SWT UI 操作,并且在不同的线程中运行。

您可以使用asyncExec or syncExec的方法Display在 UI 线程中运行一些代码。所以替换:

text.setText(i.toString());

with

final String newText = i.toString();
Display.getDefault().asyncExec(() -> text.setText(newText));

(假设您使用的是 Java 8)。

Using asyncExec将异步更新 UI。使用syncExec相反,如果您想暂停线程直到更新完成。

如果您使用的是 Java 7 或更早版本,请使用:

 final String newText = i.toString();
 Display.getDefault().asyncExec(new Runnable() {
    @Override
    public void run() {
      text.setText(newText);
    }
 });

请注意,您还应该检查Shell被处置并停止你的后台线程。如果您不这样做,您将在关闭应用程序时收到错误消息。你的代码递增i也是错误的。该线程的工作原理:

new Thread(() -> {
    for (int i = 1; true; i++) {
        try {
            Thread.sleep(1000);
        } catch (final InterruptedException e) {
            return;
        }

        if (shell.isDisposed())  // Stop thread when shell is closed
          break;

        final String newText = Integer.toString(i);
        Display.getDefault().asyncExec(() -> text.setText(newText));
    }
}).start();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定期更新 SWT 会导致 GUI 冻结 的相关文章

  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • javax.persistence.RollbackException:提交事务时出错],根本原因是 java.lang.StackOverflowError:null

    我有一个使用 Spring Data REST 框架的 Spring Boot API 从 spring boot starter parent 2 1 0 RELEASE 继承的依赖项 我正在尝试执行 PUT 或 PATCH 请求来更新实
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private

随机推荐

  • 有什么所谓的 GUI 标准吗?

    GUI 是大多数软件产品的重要领域之一 我想知道是否有一个叫做 GUI 标准的东西 它定义了 GUI 设计的最佳实践 但很深入 例如 有任何定义包含文本框的最佳大小或 Windows 窗体的宽度和高度之间的比率 只是为了给用户提供最大的便利
  • C++ 中的最大特征值(和相应的特征向量)

    在 C 中计算大型密集矩阵的 k 个最大特征值和特征向量的最简单和最快的方法 当然需要一些库 是什么 我正在寻找 MATLAB 的等效工具eigs功能 我已经浏览过 Armadillo 和 Eigen 但找不到一个 并且在我的情况下计算所有
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • 访问 nuxt 配置文件中的存储

    我想添加通过 Nuxt 静态生成的动态路由 我定义了一个客户端 服务器端存储asyncData方法 我想将这个存储值 一个数组 映射到我的nuxt config js文件使其成为 动态 静态 路线图nuxt generate命令 但如何访问
  • 有没有办法在不重新编译的情况下覆盖 .NET Windows 服务名称?

    我有一个 Windows 服务可执行文件 我知道它是用 NET 编写的 我需要将其安装在不同的服务名称下以避免冲突 安装无论如何都不提供指定服务名称 如果我只能访问二进制文件 当我使用 installutil 安装它时是否可以覆盖服务名称
  • 如何在 SVG 中显示 unicode?

    以 SVG 格式存储在数据库中的信息 如果数据包含文本 它将显示为 Unicode 有必要在浏览器中正确显示 SVG 文件
  • 使用 MFMailComposeViewController 类从 iPhone 应用程序发送带有 IMG 标签的 HTML 电子邮件

    我正在使用 MFMailComposeViewController 类从我的 iPhone 应用程序发送格式化的 HTML 电子邮件 我需要在电子邮件中包含图像 并且我在电子邮件正文中添加了 IMG 标签 IBAction shareWit
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • C++:向 std::sort 提供模板化比较函数

    假设我想让 std sort 根据指针指向的 int 值对指向 int 的指针向量进行排序 忽略那里明显的性能问题 很简单吧 做一个函数 bool sort helper const int a const int b return a l
  • netsh 结果到 PowerShell 对象

    我正在尝试与NETSH https ss64 com nt netsh html来自 PowerShell 我想看到这个命令的结果 例如一个对象 但是netsh返回一个字符串 netsh wlan show hostednetwork Ge
  • 在c中访问联盟成员

    我有一个关于c语言中union的问题 例如 typedef struct int a float c Type1 typedef struct int b char d Type2 union Select Type1 type1 Type
  • Android 纹理仅显示纯色

    我正在尝试在四边形上显示单个纹理 我有一个可用的 VertexObject 它可以很好地绘制一个正方形 或任何几何对象 现在我尝试扩展它来处理纹理 但纹理不起作用 我只看到一种纯色的四边形 坐标数据位于 arrayList 中 the ve
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • C# List 内部结构

    将对象添加到集合 例如 List 时到底会发生什么 List
  • 所以,我有 6 个“主”文件,然后分为 40 个单独的文件

    我将简要描述我想要的内容 我有 6 个 主 文件 每个文件包含 40 个工作表 如下所示 AG 工作簿有 HR Gp 1 到 HR Gp 40 ER 工作簿有 FB Gp 1 到 Gp 40 等 所有工作表都已 平坦 我已经成功创建了一个适
  • 为什么n++执行速度比n=n+1快?

    在C语言中 为什么n 执行速度快于n n 1 int n n int n n n 1 我们的老师在今天的课堂上问了这个问题 这不是家庭作业 如果您正在开发一个 石器时代 编译器 的情况下 石器时代 n比n 比n n 1 机器通常有incre
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 定期更新 SWT 会导致 GUI 冻结

    Problem 当 GUI 字段定期更新时 SWT 会冻结 我想要一个基于 SWT 的 GUI 其中文本字段的值会定期递增 最初我从单独的线程访问 textField 导致抛出异常 线程 Thread 0 org eclipse swt S