我应该在 EDT 中分配/创建 swing 元素吗?

2024-02-11

我应该在 EDT 中创建 swing 元素吗?

我在编辑非线程安全图形元素时遇到了并发问题,但我正在创建它们,但它们尚未显示,如果它们很多或需要一些时间来分配,这会冻结 GUI,但不会是吗?

下面是我使用 EDT 来显示但不创建 GUI 结构的示例:

public class Launcher {
    private final SwingWorker worker;
    private final JFrame frame;
    private final JLabel label;
    private final JProgressBar progressBar;

    public Launcher() {

        // init user interface
        frame = new JFrame();
        JPanel panel = new JPanel(new BorderLayout());
        label = new JLabel("Launching...", SwingConstants.CENTER);
        progressBar = new JProgressBar(0, 100);
        progressBar.setIndeterminate(true);
        panel.add(label, BorderLayout.CENTER);
        panel.add(progressBar, BorderLayout.PAGE_END);
        initUI(panel);
        worker = new LauncherWorker(this);
        worker.addPropertyChangeListener((PropertyChangeListener)this);
    }

    private void initUI(final Component panel) {
        if (!SwingUtilities.isEventDispatchThread()) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    DirectaChatLauncher.this.initUI(panel);
                } //run()
            });
            return;
        }
        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(panel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress".equals(evt.getPropertyName())) {
            int progress = (Integer) evt.getNewValue();
            progressBar.setValue(progress);
        }
    }

    private void setProgression(final String msg) {
        label.setText(msg);
    }

    class LauncherWorker extends SwingWorker<Boolean, String> {

        private final Launcher LAUNCHER;

        public LauncherWorker(Launcher launcher) {
            super();
            LAUNCHER = launcher;
        }

        @Override
        protected Boolean doInBackground() throws Exception {
            setProgress(0);
            publish("Started");
            ...
            setProgress(100);
            publish("Launched");
            Thread.sleep(1000);
            return Boolean.TRUE;
        }

        @Override
        protected void process(List<String> chunks) {
            LAUNCHER.setProgression(chunks.get(0));
        }

        @Override
        public void done() {
            LAUNCHER.done();
        }

    }
}

由于元素尚未显示,可以吗?或者我应该全部搬进initUI()?


在秋千上可分离的模型架构 http://www.oracle.com/technetwork/java/architecture-142923.html#separable,视图组件监听其模型。由于视图可能会任意响应模型更新生成的事件,因此相应的模型必须also将在 EDT 上更新。您可以通过以下两种基本方法之一来减少延迟:

  • Use EventQueue.invokeLater() https://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html来自单独的线程,如图所示here https://stackoverflow.com/a/7519403/230513.

  • Use SwingWorker https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html获得所列举的额外好处here https://stackoverflow.com/a/25526869/230513.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该在 EDT 中分配/创建 swing 元素吗? 的相关文章

随机推荐

  • 支持样式标签的 HTML Sanitizer for .NET

    我正在寻找一个好的 HTML 清理程序以在 ASP NET 项目中使用 问题是清理程序必须支持样式属性 这些属性可能包含 CSS 属性 这些属性也必须被清理 到目前为止我还没有找到一个好的产品可以使用 在我硬着头皮写自己的消毒剂之前 我想我
  • 在不能抛出的地方抛出NullPointerException

    我在一段无法抛出 NullPointerException 的代码中得到一个 NullPointerException 我开始认为在 JRE 中发现了一个错误 我使用javac 1 8 0 51作为编译器 问题出现在jre 1 8 0 45
  • 在 Electron process.stderr 中未定义

    我正在尝试在我的 Electron 应用程序中使用 sqlite3 nodejs 插件 我在加载 sqlite3 模块时遇到错误 查看崩溃的堆栈跟踪 我发现 sqlite3 有多个依赖项 其中之一是日志库 npmlog 该库尝试从以下位置初
  • Google Glass:执行“点击”事件或类似的事件

    请看下面的代码
  • 在 ES6 中如何调用我的类的父类的父类的构造函数?

    我正在使用 ES6 类 我的类 A 扩展了类 B 类 B 扩展了类 C A 如何扩展一个方法 然后调用该方法的 C 版本 class C constructor console log class c class B extends C c
  • 如何在 SQL Server Express 表中保存 QTime 并读取它?

    我在 SQL Server Express 中有一个包含字段的表name varchar 10 and timeVar time我想保存 a 的值QTime变量在time field 这是我尝试过的 QTime time QTime cur
  • 无法按名称激活工作表

    我试图在打开电子表格时根据当前月份激活每月工作表 问题出在脚本末尾 无法选择工作表 看起来getSheetByName gets a null值 不被接受setActiveSheet function selectmonth var now
  • 搜索大量大文本的最快方法

    我有一个用 C 编写的 Windows 应用程序 需要从数据库加载 250 000 行 并提供 键入时搜索 功能 这意味着只要用户在文本框中键入内容 应用程序就需要搜索所有 250 000 条记录 其中顺便说一句 单列 每行 1000 个字
  • 使用 Box2D 制作角色动画的最佳方法是什么?

    我正在为 Android 开发一款 2D 水下动作角色扮演游戏 使用 Box2D 作为物理引擎 主要用于碰撞检测 碰撞响应以及游戏角色在由墙壁 岩石和其他生物组成的环境中的移动 我尝试了两种不同的方法来使用 Box2D 实现角色动画 但都发
  • 无法将类型“System.Reflection.PropertyInfo”转换为

    我正在尝试使用反射来迭代我的类之一中的所有属性 public MDInstrument base PropertyInfo properties typeof MDInstrument GetProperties foreach Prope
  • Oauth2 PKCE 谁应该生成代码验证器和代码质询

    我正在编写将与某些 Oauth2 提供商集成的客户端应用程序 我将把原生 android 应用程序作为前端 将 spring boot 作为后端 我想将授权代码流与 PKCE 一起使用 我的问题是谁应该生成代码验证程序和代码挑战 我的后端还
  • 提取字符串的前(或后)n 个字符

    我想提取第一个 或最后一个 n字符串的字符 这相当于 Excel 的LEFT and RIGHT 一个小例子 create a string a lt paste left right sep a 1 leftright 我想生产b 一个等
  • Selenium 隐式等待与 Thread.sleep()

    根据 selenium 的说法 隐式等待会在一定时间内轮询 DOM 以查看元素是否出现 我的理解是 它将轮询指定的时间 但如果之前出现过某个元素 那么它将继续 而无需进一步等待 http seleniumhq org docs 04 web
  • PartialFunction orElse 的类型界限是否比应有的更宽松?

    让我们定义一个PartialFunction String String and a PartialFunction Any String 现在 给出定义orElse def orElse A1 lt A B1 gt B that Part
  • Scala下划线解释

    看看这些 scala 片段 如果我们有这样的东西 List List 1 2 List 3 4 List 5 map x gt x size 我们可以将其缩短为 List List 1 2 List 3 4 List 5 map size
  • 哪种排序算法可提供最佳的最坏情况性能?

    对于绝对最坏的情况 最快的已知排序算法是什么 我不关心最好的情况 并且假设有一个巨大的数据集 如果这很重要的话 确保你已经看到这个 可视化排序算法 http www sorting algorithms com 它帮助我决定使用哪种算法
  • Php PDO 函数:lastInsertId 的安全性如何?

    我对 Php PDO 函数 lastInsertID 没有什么困惑 如果我理解正确的话 它会返回插入数据库的最后一个自动增量ID 当我创建注册用户的功能时 当我执行在数据库中插入用户的查询时 我通常会使用此函数 我的问题是 例如 我有一百个
  • 设置JAVA_HOME和JRE_HOME路径

    我被分配了一个 Linux 机器 里面有 java 可用 java version java version 1 7 0 09 icedtea OpenJDK Runtime Environment rhel 2 3 4 1 el6 3 x
  • twitter4j - 如何配置?

    我正在尝试使用编写一个简单的 Twitter 客户端推特4j http twitter4j org 但我似乎无法完成第一步 配置参数 有一个配置页 http twitter4j org en configuration html在网站上说我
  • 我应该在 EDT 中分配/创建 swing 元素吗?

    我应该在 EDT 中创建 swing 元素吗 我在编辑非线程安全图形元素时遇到了并发问题 但我正在创建它们 但它们尚未显示 如果它们很多或需要一些时间来分配 这会冻结 GUI 但不会是吗 下面是我使用 EDT 来显示但不创建 GUI 结构的