【问题标题】:Show dialog when Swing exception is thrown抛出 Swing 异常时显示对话框
【发布时间】:2012-06-11 08:47:55
【问题描述】:

我有一个使用 swing 的 Java 应用程序。我找到了一种在应用程序中捕获所有未捕获异常的方法(见下文)。我想记录一条消息,为用户显示一个带有消息的对话框并终止应用程序。问题是,我试图捕捉的是一些摆动异常。在 UncaughtExceptionHandler 中捕获异常后尝试显示对话框是不可能的,因为 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
    }
});

【问题讨论】:

    标签: java multithreading swing exception jdialog


    【解决方案1】:

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

    当由于异常杀死当前 EDT 而更换 EDT 时,我们有一个解决方法。我们不使用常规的SwingUtilities#invokeLater 来显示对话框,而是使用

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

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

    【讨论】:

    • 谢谢,我所做的比我实际工作的要好得多(我只是没有看到对话框,因为它在我的启动屏幕下方......)。
    • 当在aRunnable 中显示模态对话框时,我仍然会得到一个无限循环。如果我用记录器替换模态对话框,则没有无限循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2019-01-07
    • 2013-01-28
    • 2017-07-22
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多