使用自定义 Swing 组件进行文本换行的 JOptionPane

JOptionPane with text wrapping using custom Swing component

我已经使用 JOptionPanes 编写了很多项目,几乎每次我都因为无法在其中包含文本而感到沮丧。

我知道 JOptionPane 支持 HTML,但这似乎总是达不到我想要的效果。一方面,JOptionPane 不完全支持 HTML - 例如,max-width 属性 会很棒。另一方面,<br /><p> 标签都没有提供我真正想要的功能——一个 JOptionPane,它在消息较小时很小,在消息较大时可以增长,但不会得到太大,最终换行。

这让我想到了我的问题。有什么方法可以编写我自己的自定义组件,也许是从 JFrame 或类似的东西继承,这将允许我模拟 JOptionPane 的效果,但它提供了更细粒度的控制显示的文字?这至少应该包括控制最大宽度和换行的功能。

我还没有通过搜索其他问题找到答案(也许答案被所有说 "use HTML" 的答案淹没了)。这不是那些问题的重复。

您是在谈论诸如仅添加换行符以使选项框不显示这一长串文本之类的事情吗?如果是:

JOptionPane.showMessageDialog(null, "This "\nmessage "\nhas "\nlinebreaks.")

应该够了。使用 \n(text) 创建一个换行符。希望这会有所帮助,祝你有个美好的夜晚。 :)

import java.awt.Component;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class OptionPaneUtilities {

    public static void main(String[] args) {
        OptionPaneUtilities.showMessage(null, "I sometimes I think we forget just how flexible the JOptionPane API is and what it can do. A little effort could go a long way");
    }

    public static void showMessage(Component comp, String message) {
        JTextArea ta = new JTextArea(message, 1, 20);
        ta.setWrapStyleWord(true);
        ta.setLineWrap(true);
        ta.setOpaque(false);
        ta.setBorder(null);
        ta.setEditable(false);
        ta.setFocusable(false);
        JOptionPane.showMessageDialog(comp, ta);
    }

}

现在,显然,这只是一个非常简单的示例,您将不得不花一些时间思考如何最好地将此概念应用到您自己的 API 中,以便它满足您的需求并提供你拥有最大的灵活性。

您可以改用 JEditorPane 并获得纯文本和 HTML 以更加努力地工作