JScrollPane(JTextPane)的以下行为似乎超出我的薪水范围:

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

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


如果我通过textPane.setText("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM")设置textPane的内容,则textPane会展开,而scrollPane会正确执行其工作。

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

但是,如果我使用textPane重定向使用MessageConsoleouterr,则会进行自动换行。我检查了MessageConsole的来源,它没有改变textPane的自动换行行为。看来textPane.getDocument().insertString(.)导致textPane无法正确扩展。

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


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

通过textPane.getDocument().insertString(.)传送内容时,如何避免自动换行?我已经尝试删除此换行符超过3小时,但仍未成功,非常感谢您的帮助。

最佳答案

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

由于其他所有行都适合首选宽度,因此不需要包装所有其他行上的文本。

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

这种包装是由JTextPane的Scrollable接口的默认实现引起的。 getScrollableTracksViewportWidth()方法的默认实现返回true,它基本上试图将所有文本适合视口的宽度,并在可能的情况下进行换行。

如果您不希望自动换行,请查看No Wrap Text Pane。它显示了如何通过使Scrollable方法返回getScrollableTracksViewportWidth()来更改文本窗格的默认false行为。

07-24 16:05