动态添加的内容无法正确滚动(JScrollPane 内的 JTextPane)

Dynamically added content doesn't scroll correctly (JTextPane inside JScrollPane)

JScrollPane(JTextPane) 的以下行为似乎超出了我的薪资等级:

我在我的框架中添加了一个 textPane inside a scrollPane。

    textPane = new JTextPane();
    scrollPane = new JScrollPane(textPane);

如果我通过 textPane.setText("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM") 设置 textPane 的内容,textPane 正在展开并且 scrollPane 正在正常工作。

但是,如果我使用 textPane 重定向 out 并使用 MessageConsole 重定向 err,它会进行某种自动换行。我检查了 MessageConsole 的来源,它没有改变 textPane 的任何自动换行行为。 textPane.getDocument().insertString(.) 似乎导致 textPane 无法正确扩展。

    MessageConsole mc = new MessageConsole(textPane);
    mc.redirectOut();
    mc.redirectErr(Color.RED, null);
    mc.setMessageLines(100);

当通过 textPane.getDocument().insertString(.) 提供内容时,如何避免自动换行的发生?我已经尝试删除此换行符 3 个多小时未成功,在此非常感谢您的帮助。

在第一种情况下,当您添加一长串没有空格的文本时,没有地方可以将文本拆分为新行,因此首选宽度似乎变成了长行的宽度文本。

所有其他行的文本不需要换行,因为它们适合首选宽度。

但是,在第二种情况下,存在空格,因此文本窗格的默认行为是在视口填满后自动换行。

这种换行是由 JTextPane 的 Scrollable 接口的默认实现引起的。 getScrollableTracksViewportWidth() 方法 returns true 的默认实现,它基本上尝试将所有文​​本调整到视口的宽度,使其在可能的情况下换行。

如果您不想让文字换行,请查看 No Wrap Text Pane。它显示了如何通过使用 getScrollableTracksViewportWidth() 方法 return false.

来更改文本窗格的默认 Scrollable 行为