【问题标题】:Java SWT Changing Label text on widget selected is not working on MacJava SWT 更改所选小部件上的标签文本在 Mac 上不起作用
【发布时间】:2018-09-24 14:39:08
【问题描述】:

在我的 java swt 应用程序中,我有以下代码。在按钮选择上,我需要两次更改标签的文本,一次是在运行线程之前,另一次是在线程完成之后。它适用于 Windows,但在 Mac 上它不显示第一个文本。为什么这在 Mac 上不起作用?

button.addSelectionListener(new SelectionAdapter() {

        public void widgetSelected(SelectionEvent arg0) {
            statusLabel.setText("Running...");
            Thread background = new Thread() {
               @Override
               public void run() {
               // Long running task
               }
            };
            background.start();
            try {
                background.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            statusLabel.setText("Finished");
        }
    });

【问题讨论】:

  • background.join 将阻塞 UI 线程并且不会更新任何内容 - 您不能在 SWT 应用程序中等待这样的线程。
  • 好的。即使我删除了 background.join statusLabel 也不会显示第一个文本。你知道我该怎么做吗?
  • 好吧,如果您只是删除join,该代码将立即将文本设置为已完成。当后台线程完成使用Display.asyncExec 时,您已触发更新。
  • 好的。但它在 Windows 上运行良好。
  • 添加了建议代码的答案

标签: java eclipse macos swt


【解决方案1】:

Thread.join 的调用阻塞了 UI 线程,这将导致它停止响应。在此发生之前,究竟要更新多少取决于每个平台上的 SWT 实现细节。

代码完成后,您应该从后台线程更新 UI。

类似:

button.addSelectionListener(new SelectionAdapter() {

   public void widgetSelected(SelectionEvent arg0) {

      statusLabel.setText("Running...");

      Thread background = new Thread() {
         @Override
         public void run() {
            // Long running task

            // Update UI from background thread
            Display.getDefault().asyncExec(() -> statusLabel.setText("Finished"));
         }
      };

      background.start();
  }
});

【讨论】:

  • 非常感谢您!我正在向我的 SWT 应用程序(我几乎完全在 Windows 上开发)添加对 macOS 的支持,但不知道为什么我的 UI 没有正确更新。感谢您提供这个简单、直接的解决方案。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多