【问题标题】:Text wrap in JOptionPane?JOptionPane 中的文本换行?
【发布时间】:2012-12-10 07:03:37
【问题描述】:

我正在使用以下代码在我的 Swing 应用程序中显示错误消息

try {
    ...
} catch (Exception exp) {
    JOptionPane.showMessageDialog(this, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}

错误对话框的宽度会变长,具体取决于消息。有什么方法可以包装错误信息吗?

【问题讨论】:

    标签: java html swing exception joptionpane


    【解决方案1】:

    将您的消息添加到可以换行的文本组件中,例如JEditorPane,然后将编辑器窗格指定为message 到您的JOptionPane。有关示例,请参见 How to Use Editor Panes and Text PanesHow to Make Dialogs

    附录:作为换行的替代方法,请考虑在滚动窗格中使用面向行的方法,如下所示。

    f.add(new JButton(new AbstractAction("Oh noes!") {
        @Override
        public void actionPerformed(ActionEvent action) {
            try {
                throw new UnsupportedOperationException("Not supported yet.");
            } catch (Exception e) {
                StringBuilder sb = new StringBuilder("Error: ");
                sb.append(e.getMessage());
                sb.append("\n");
                for (StackTraceElement ste : e.getStackTrace()) {
                    sb.append(ste.toString());
                    sb.append("\n");
                }
                JTextArea jta = new JTextArea(sb.toString());
                JScrollPane jsp = new JScrollPane(jta){
                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(480, 320);
                    }
                };
                JOptionPane.showMessageDialog(
                    null, jsp, "Error", JOptionPane.ERROR_MESSAGE);
            }
        }
    }));
    

    【讨论】:

    • 使用它来编写更少的代码来将堆栈跟踪放入字符串:stackoverflow.com/a/4812589
    • 在错误消息比预期长的情况下,您的更合适。
    【解决方案2】:

    默认情况下,JOptionPane 将使用JLabel 来显示文本。标签将格式化 HTML。在 CSS 中设置最大宽度。

    JOptionPane.showMessageDialog(
        this, 
        "<html><body><p style='width: 200px;'>"+exp.getMessage()+"</p></body></html>", 
        "Error", 
        JOptionPane.ERROR_MESSAGE);
    

    更一般地,请参阅How to Use HTML in Swing Components,以及这个简单的example of using HTML in JLabel

    【讨论】:

    • @laksys:没错,String 会自动包装在支持 HTMl 的 JLabel 中。
    • 不要忘记对字符串进行 html 转义,否则某些特殊字符可能不起作用。
    • 为了记录,没有必要关闭标签,甚至打开正文。只要有&lt;html&gt; 标签,Java 就可以很好地解析 HTML。
    • @Lee 你为什么建议任何人不要关闭标签?
    • 对于&lt;html&gt; 标签,不需要关闭它(其他可能)。它只是更快、更容易并且可能更具可读性。
    【解决方案3】:

    捕获(异常 e){ e.printStackTrace();

                    StringBuilder sb = new StringBuilder(e.toString());
                    for (StackTraceElement ste : e.getStackTrace()) {
                        sb.append("\n\tat ");
                        sb.append(ste);
                    }
                      
                    JTextArea jta = new JTextArea(sb.toString());
                    JScrollPane jsp = new JScrollPane(jta) {
                        @Override
                        public Dimension getPreferredSize() {
                            return new Dimension(750, 320);
                        }
                    };
                    JOptionPane.showMessageDialog(
                            null, jsp, "Error", JOptionPane.ERROR_MESSAGE);
                    break; /// to show just one time 
                }
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2014-07-06
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多