SwingWorker 中的错误处理

2023-11-27

我的问题是基于理论的问题,但它确实满足了我的特定需求。

当您的 SwingWorker 抛出异常时,您 a) 可以预见并且 b) 需要恢复并继续,但您想通知用户此错误已经发生,您会怎么做?如何捕获预期的异常并通知用户而不违反“No Swing code fromdoInBackground()" rule?

考虑到这个问题,我开发了一个SSCCE,我想将其与下面的问题一起提出。

SSCCE:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutionException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Test {

    public static void main(String args[]) {
        final JFrame frame = new JFrame();
        JButton go = new JButton("Go.");
        go.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Task(frame);
            }
        });
        frame.add(go);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    static class Task extends SwingWorker<Void, Void> {
        JFrame parent;
        JDialog dialog;
        public Task(JFrame parent) {
            this.parent = parent;
            dialog = new JDialog(parent);
            JProgressBar jpb = new JProgressBar();
            jpb.setIndeterminate(true);
            dialog.add(jpb);
            dialog.setLocationRelativeTo(null);
            dialog.setVisible(true);
            execute();
        }

        @Override
        protected Void doInBackground() throws Exception {
            for(int i = 0; i < 100000; i++) {
                System.out.println(i);
                try {
                    if(i == 68456) throw new IllegalStateException("Yikes! i = 68456.");
                } catch (final IllegalStateException e) {
                    SwingUtilities.invokeAndWait(new Runnable() {
                        @Override
                        public void run() {
                            JOptionPane.showMessageDialog(parent, "Error: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                        }
                    });
                }
            }
            return null;
        }

        @Override
        protected void done() {
            if (!isCancelled()) {
                try {
                    get();
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("done");
            dialog.dispose();
        }

    }
}

拨打电话是否有效SwingUtilities.invokeAndWait()doInBackground() method?我对此做了一些线程分析,结果如下:

enter image description here

一旦按下“Go”按钮,SwingWorker-pool-1-thread-1线程变绿。 THEN,当满足if条件时,抛出错误,并显示错误对话框,线程进入yellow,并且确实有一个绿色的“光点”AWT-EventQueue-0线程,表明 EDT 已被调用。我等了大约 10 秒钟,按下“确定”,然后SwingWorker线程再次变绿。

做这样的事情有任何潜在的陷阱吗?有谁有从实时通知用户计算错误的经验吗?SwingWorker?

老实说,这种方法让我感到怀疑。它seems非正统,但我不能肯定地说这是否是一个坏主意。


我认为使用没有问题invokeAndWait()当用户实际needs审批。如果没有,如图所示example, a SwingWorker<Void, String>可以简单地调用publish()数据和错误消息交错。附加适当的消息done()如有必要,将允许用户查看累积的输出。

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

SwingWorker 中的错误处理 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 将 json 数据转换为 html 表 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 是否有任何 jQuery 或 javascript 库可以根据给定的 json 数据生成动态表 我不想定义列 库应该读取 json 哈希中的键并生成列 当然 我可以自己迭代json数
  • 如何获取特定语言的 DBpedia 数据?

    我尝试了这个请求 但如果我想检索意大利语信息 还有其他服务 类似 可以吗 你可以使用dbpedia SPARQL 端点运行查询 例如 PREFIX rdfs
  • 在 Python 中跟踪被忽略的异常?

    我的应用程序有一个自定义音频库 它本身使用 BASS 库 我在整个程序中创建和销毁 BASS 流对象 当我的程序随机退出时 我还没有弄清楚模式 我在控制台上收到以下通知 Exception TypeError NoneType object
  • 16:跳过密码保存,因为可能会提示用户使用 Android 自动填充

    我正在将谷歌智能锁集成到我的 Android 应用程序中 但在某些设备中 当我尝试将凭据保存到谷歌时 我收到此错误 我正在使用以下代码来保存凭据 Credential credential new Credential Builder em
  • 我可以将签出的文件集成到 perforce 上的不同分支中吗

    我们正在进行设计 为此我们在主分支中创建了类的骨架 现在 我们开始编码 为此我们有了一个新分支 因此 如果我可以将主分支中的所有新文件移动到新分支中 那就太好了 但是 我还无法签入它们 那么 是否可以集成已签出的变更列表 谢谢 Perfor
  • 检查 smoothScrollToPosition 何时完成

    我想查一下什么时候smoothScrollToPosition已完成滚动回第一项recyclerview 我尝试这样做 只有当 smoothScrollToPosition 仍在滚动时才有效 recyclerView getLayoutMa
  • 将具有 IFormFile 属性的模型从 Angular2 上传到 ASP.NET Core Web Api

    我正在尝试发送模型 其中一部分是代表用户头像的 IFormFile 类型属性 但不幸的是 我的头像属性始终为空 我看到了很多如何发送单个图片元素的示例 但我可以找到当它是模型的一部分而不是完成时的单个元素时如何发送它的示例例如这里 这是我设
  • 使用 AAD 令牌在 Databricks 中创建 Azure Key Vault 支持的秘密范围

    我的最终目标是将 ADLS gen2 容器安装到我的 Databricks 工作区中 作为在 Azure 服务主体的支持下由 Terraform 管理的部署的一部分 这是一个单一部署 它创建所有 Azure 资源 网络 防火墙 存储帐户 D
  • CSS 箭头进度条

    我目前正在学习有关 css 的所有内容 因此我尝试生成具有不同功能的不同形状 我目前正在开发一个项目 该项目需要一个水平箭头来显示发生的事务的 进度 所以我试图生成一个箭头 进度条 例如 XX 10 gt the XX s depict a
  • 使用 Enzyme 测试窗口滚动事件处理程序的最佳方法是什么?

    我一直在与一个新团队一起开发 React 应用程序 讨论围绕为触发 window scroll 事件方法的组件编写单元测试进行 那么 我们以这个组件为例 import React Component from react class MyC
  • 来自 HTTP 客户端的 PUT 请求后收到“411 Length required”

    我正在开发一个实现 HTTP 客户端的 Java 程序 我测试它向服务器发送请求 GET POST 和 DELETE 请求工作正常 例如 在 POST 请求之后我得到一个输出 Data extracted status message ok
  • Nodejs 为什么await 只限于异步函数?

    可能重复的wait 仅在 async 函数中有效 我是新来的NodeJS我发现了这个概念async await有点混乱 经过一番阅读和摸索 这是我的理解 假设我有一个函数sum像这样 function sum a b print the n
  • 复制的重复文件(Android Studio 0.4.0)[重复]

    这个问题在这里已经有答案了 在我的项目中 我使用 Apache 的 httpcore 和 httpmime 库 将 Android Studio 更新到 0 4 0 后 我在构建项目时遇到了以下问题 Duplicate files copi
  • 用于更新查找表中向量的某些值的规范 tidyverse 方法

    我经常需要根据查找表重新编码数据框列中的一些 不是全部 值 我对我所知道的解决问题的方法不满意 我希望能够在清晰 稳定 高效方式 在编写自己的函数之前 我想确保我没有复制已经存在的标准 Toy example data data frame
  • Chrome 扩展程序历史记录 API

    我正在编写一个 chrome 扩展 需要分析最近的浏览历史记录对于特定选项卡 The chrome history API允许我搜索全局历史记录中的项目 但似乎没有提供将结果本地化到特定选项卡的方法 我是否错过了什么 或者这是不可能得到的
  • 初始化后向Select2添加选项

    这似乎是一件标准的事情 但我正在努力寻找一个清晰而简单的解决方案 我希望能够向已初始化的 Select2 添加一个或多个附加选项 我正在使用旧版本的 Select2 但不确定该版本是什么 您可以像在标准中解决大多数问题一样解决涉及 Sele
  • Android:保存应用程序单例类中存储的数据的最佳方法

    保存 Android 应用程序的应用程序类 单例 中存储的数据的最佳方法是什么 我有一个安静的大应用程序 可以在活动之间共享大量数据 所以大部分都存储在Application Singleton上 一切都很好 util应用程序被操作系统在内
  • 一直向下滚动到 UITableView 的底部

    I ve a UITableView我试图将 36 行加载到其中 然后一直向下滚动到最后一个单元格 我试过这个 func reloadData chatroomTableView reloadData chatroomTableView s
  • PHP Artisan 使用 MAMP 和 Unix Socket 进行迁移

    我最初是在 Laravel 4 2 中开发我的应用程序 但后来决定将其移动到 5 0 版本 以便它涵盖 5 0 相对 4 2 的更多变化和优势 我正在尝试运行我的迁移 但是收到错误 PDOException SQLSTATE HY000 2
  • SwingWorker 中的错误处理

    我的问题是基于理论的问题 但它确实满足了我的特定需求 当您的 SwingWorker 抛出异常时 您 a 可以预见并且 b 需要恢复并继续 但您想通知用户此错误已经发生 您会怎么做 如何捕获预期的异常并通知用户而不违反 No Swing c