JOptionPane 中的文本换行?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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);
        
    
));

【讨论】:

使用它来编写更少的代码来将堆栈跟踪放入字符串:***.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。

以上是关于JOptionPane 中的文本换行?的主要内容,如果未能解决你的问题,请参考以下文章

Java JOptionPane 默认文本

在JOptionPane中对齐文本

Java JOptionPane 文本不可读

Java:使用 JOptionPane.showInputDialog(null, "Text"); 的多行文本

如何去掉文本中的回车换行符或任意字符

如何创建 JTextField 数组并从 String 数组中检索文本?