小鸭子的学习笔记duck

Duck Blog

唐如飞

( ^∀^)/欢迎\( ^∀^)

79 文章数
14 评论数

IDEA插件开发-BUG-数据源树无法正常刷新

tangrufei
2023-11-10 / 0 评论 / 112 阅读 / 0 点赞

错误代码

// 使用 ProgressManager 显示进度条
        ProgressManager progressManager = ProgressManager.getInstance();
        progressManager.run(new Task.Backgroundable(ProjectUtils.getCurrProject(), "Saving Data Source Configurations") {
            @Override
            public void run(@NotNull ProgressIndicator indicator) {
                // 在这里执行保存操作
                instance.mergeAndClearConnectionInfos(databaseConnectionInfos);
                JTree databaseTree = null;
                try {
                    databaseTree = DataBaseToolWindowContent.getInstants().getDatabaseTree();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
                try {
                    ConnectionInfoTreeUtil.refreshTree(databaseTree);
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        });

正确代码

// 使用 ProgressManager 显示进度条
        ProgressManager progressManager = ProgressManager.getInstance();
        progressManager.run(new Task.Backgroundable(ProjectUtils.getCurrProject(), "Saving Data Source Configurations") {
            @Override
            public void run(@NotNull ProgressIndicator indicator) {
                // 在这里执行保存操作
                instance.mergeAndClearConnectionInfos(databaseConnectionInfos);
                JTree databaseTree = null;
                try {
                    databaseTree = DataBaseToolWindowContent.getInstants().getDatabaseTree();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
                try {
                    ConnectionInfoTreeUtil.refreshTree(databaseTree);
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        });

原因分析

线程问题: 在非沙箱环境中,确保在 UI 操作中使用正确的线程。刷新 UI 的操作通常应该在 UI 线程上执行。可以使用 ApplicationManager.getApplication().invokeLater() 来确保在正确的线程上执行刷新操作。

文章不错,扫码支持一下吧~
上一篇 下一篇
评论
来首音乐
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月