在Java 6及以下的所有版本中,将JTextPane放入JScrollPane的默认行为是:尽可能在单词边界处换行。如果不行,则无论如何都要换行。
JDK 7的默认行为似乎是:尽可能在单词边界处换行。如果不行,则只是扩展JTextPane的宽度(永远不会换行长单词)。
很容易复现这个问题,以下是一个SSCCE示例:
public class WrappingTest extends JFrame
{
public static void main ( String[] args )
{
new WrappingTest();
}
public WrappingTest ()
{
setSize(200,200);
getContentPane().setLayout(new BorderLayout());
JTextPane jtp = new JTextPane();
JScrollPane jsp = new JScrollPane(jtp);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
getContentPane().add(jsp,BorderLayout.CENTER);
setVisible(true);
}
}
只需在JDK 6中运行它,在JDK 7中编写一些小单词和一个长单词,您就会看到差异。我的问题很简单... JDK 7中的新默认行为完全混乱了我的程序(Oracle在更改此类默认值时应更加小心...它们似乎不重要,但当您使用JTextPane显示通常包含非常长的字母字符串的数据时,它们并不那么不重要-事实上,我将提交错误报告,但在此期间/如果他们没有解决它,我想有一个解决方法)。有没有办法返回以前的行为?请注意,我已经检查了相关问题的答案How is word-wrapping implemented in JTextPane, and how do I make it wrap a string without spaces?,但它没有回答这个问题-它提供了一种使JTextPane在完全不考虑空格的情况下换行的方法,但对我来说,期望的行为是在可能的情况下在空格处拆分行,否则在其他地方(与以前的Java版本相同)。
invokeLater()
有帮助吗? - Catalina Island