在 HTMLDocument 支持的 JTextArea 中,Enter 键不会换行

Enter key doesn't make line break in JTextArea backed with HTMLDocument

下面的代码显示您可以编辑的文本,但是当您按下 ENTER 时不会出现换行符。

为什么以及如何解决?

这是因为HTMLDocument被用作模型。如果使用默认模型,则会插入并显示换行符。

public class JTextAreaTry extends JFrame {

    private HTMLDocument doc = new HTMLDocument();

    {
        try {
            doc.insertString(0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
                + "Phasellus tincidunt, neque ac lobortis viverra, nunc erat convallis leo, sit amet varius purus metus ac dolor. "
                + "Morbi pellentesque velit eu ornare pellentesque. "
                + "Sed lectus orci, sollicitudin non nunc in, vehicula mollis massa. "
                + "Sed a est ac arcu auctor interdum. "
                + "Duis at mauris pellentesque, semper massa nec, cursus nulla. "
                + "Fusce sed rhoncus nisl. Sed et sollicitudin mauris, a laoreet nulla. "
                + "Donec interdum volutpat orci, non placerat odio ultrices non.", null);
        } catch (BadLocationException e) {
            e.printStackTrace();
        }
    }

    JTextArea textArea;

    {
        textArea = new JTextArea();
        textArea.setDocument(doc); // comment this
        textArea.setLineWrap(true);
        add(textArea);
    }

    public static void main(String[] args) {
        JFrame frame = new JTextAreaTry();

        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

}

JTextArea 专为纯文本而不是样式文本设计。如果您打算使用 HTML-formatted 文本,那么请考虑使用 JEditorPane / JTextPane,它具有 built-in 对 HTML 的支持(并且 line-breaking 按回车键)。示例如下:

JEditorPane ep = new JEditorPane(); 
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = new HTMLDocument();
ep.setEditorKit(kit);
ep.setDocument(doc);
kit.insertHTML(doc, doc.getLength(), "<b>Hello world!</b>", 0, 0, null);