Swing的JLabel中如何写栈异常?

How to write stack exception in JLabel of Swing?

我必须在标签和日志文件中写入堆栈异常:

try {
   ...
} catch(Exception e) {
    File file = new File(pathFile + "//error.log");
    PrintStream ps = new PrintStream(file);
    e.printStackTrace(ps);
    ps.close();
}

如何在 Swing JLabel 中也写 e

我用的是JOptionPane

catch (Exception e) {
    java.io.StringWriter sw = new java.io.StringWriter();
    java.io.PrintWriter pw = new java.io.PrintWriter(sw);
    e.printStackTrace(pw);
    String stackTrace = sw.toString();
    javax.swing.JTextArea textArea = new javax.swing.JTextArea(stackTrace);
    javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane(textArea);
    javax.swing.JOptionPane.showMessageDialog(null,
                                              scrollPane,
                                              e.toString(),
                                              javax.swing.JOptionPane.ERROR_MESSAGE);
}

请注意,调用方法 showMessageDialog 的第一个参数为空,因为您问题中的代码不显示任何 Swing 组件。您应该尝试使用 GUI 中的实际组件而不是 null。

方法 showMessageDialog 的第二个参数是 Object which basically means it can be anything you like. In the above code it is a scroll paneJOptionPane 知道如何处理和显示它。

方法 printStackTrace,在 class java.lang.Throwable 中被重载。上面的代码演示了一种将整个堆栈跟踪作为单个字符串获取的方法。方法 printStackTrace and PrintWriter constructor and class StringWriter.

参考 javadoc

其实我有一个实用工具class。

public class MessageWindow {
    public static void showError(Exception e) {
        java.io.StringWriter sw = new java.io.StringWriter();
        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
        e.printStackTrace(pw);
        String stackTrace = sw.toString();
        javax.swing.JTextArea textArea = new javax.swing.JTextArea(stackTrace);
        javax.swing.JScrollPane scrollPane = new javax.swing.JScrollPane(textArea);
        javax.swing.JOptionPane.showMessageDialog(null,
                                                  scrollPane,
                                                  e.toString(),
                                                  javax.swing.JOptionPane.ERROR_MESSAGE);
    }
}

然后我只调用 catch 块中的方法。

catch (Exception e) {
    MessageWindow.showError(e);
}