java - 抛出 Swing 异常时显示对话框

标签 java multithreading swing exception jdialog

我有一个使用 swing 的 Java 应用程序。我找到了一种捕获应用程序中所有未捕获异常的方法(见下文)。我想记录一条消息,为用户显示一个包含消息的对话框并终止该应用程序。问题是,我想要捕捉的是一些 Swing 异常。在 UncaughtExceptionHandler 中捕获异常后尝试显示对话框是不可能的,因为 Swing 线程已停止。有什么办法可以显示一个对话框吗?创建一个新的 Swing 线程或类似的东西?

谢谢!

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    boolean alreadyCaught = false;

    public void uncaughtException(Thread t, Throwable e) {
        if (alreadyCaught)
            return;

        alreadyCaught = true;
        e.printStackTrace();

        //show Dialog
    }
});

最佳答案

完全有可能从默认的未捕获异常处理程序中显示一个对话框。我们的一款产品在过去 5 年里一直使用这种机制,没有出现任何问题。

我们有一个解决方法,可以解决由于异常终止当前 EDT 而替换 EDT 时出现的问题。我们不使用常规的 SwingUtilities#invokeLater 来显示对话框,而是使用

new Thread( new Runnable() {
      public void run() {
        EventQueue.invokeLater( aRunnable );
      }
    } ).start();

这允许 EDT 被新的 EDT 替换,并在新创建的 EDT 上运行 Runnable

关于java - 抛出 Swing 异常时显示对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929425/

相关文章:

java - 值未从 JList 传递到另一个 JList

java - 用Java画对角线

java - 我如何使用 Java 中的 Selenium 选择这个元素?

java - 导入org.omg无法解析

java - JNI - 自动将所有新生成的线程从进程附加到 JVM?

html - 将 HTML 文本分配给 NSAttributedString 会在全局队列上抛出 EXC_BAD_ACESS

.net - 我可以将 BeginInvoke 与 MulticastDelegate 一起使用吗?

java - 二进制搜索未排序的数组

java - Tomcat 服务器未启动。在 eclipse 中

java - ActionEvent - 按下按钮时更改 JLabel