【发布时间】:2015-05-15 11:06:51
【问题描述】:
运行下面的代码 java 6 和 java 8,看看结果。换行符在 java 6 上的 visibleEditorRect 范围内有效,但在 java 8 上,字符串溢出边界。有没有解决这个问题的方法。
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.plaf.basic.BasicTextPaneUI;
public class TextPaneBug {
public static void main(String[] args) {
JFrame f = new JFrame() ;
JTextPane text = new BugTextPane() ;
f.add(text);
text.setText("mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm");
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setVisible(true);
}
static class BugTextPane extends JTextPane
{
public BugTextPane() {
setUI(new BasicTextPaneUI(){
@Override
protected Rectangle getVisibleEditorRect() {
Rectangle r = super.getVisibleEditorRect() ;
Rectangle newr = new Rectangle(r.width / 2 - 300 , r.height/2 - 300 , 600 ,600) ;
return newr;
}
protected void paintSafely(java.awt.Graphics g) {
super.paintSafely(g);
Rectangle r = getVisibleEditorRect() ;
g.drawRect(r.x,r.y,r.width,r.height);
};
}
);
}
}
}
【问题讨论】:
-
为什么覆盖可见矩形如此重要?我猜你使用一些技巧来实现一些行为。
-
我们有一个带有分页的文本编辑器和基于 visibleEditorRect 的分页逻辑。所以我们的编辑器不能像预期的那样使用 java 8。
-
所以我可以看到问题是换行了。这里可能是stackoverflow.com/questions/8666727/…。
-
是的,它似乎是关于 java 7 的包装行为更改,并且有很多关于新包装行为的错误报告,但没有修复版本。我认为 Oracle 不接受这种情况作为错误。
-
您可以在帖子中看到我的回答。它修复了该行为,但需要修补 EditorKit