【发布时间】:2014-06-15 20:16:34
【问题描述】:
也许我遇到了错误或更可能做错了什么;)
我尝试使用JScrollPanel 翻译用户绘制的JPanel 的内容。在面板里面我想通过Graphics类getClipBounds方法访问可视区域来提高渲染性能。
在 SO 上搜索会带来很多关于 JScrollPane 的结果,但没有提到剪辑边界的问题。谷歌也一样。
用户绘制的面板
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Content extends JPanel {
@Override
protected void paintChildren(Graphics g) {
super.paintChildren(g);
// intense clip bounds dependent rendering here
System.out.println(g.getClipBounds());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(2000,2000);
}
}
主机设置
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import java.awt.BorderLayout;
public class ClipBoundsIssue {
private JFrame frame;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ClipBoundsIssue window = new ClipBoundsIssue();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ClipBoundsIssue() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane();
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
Content content = new Content();
scrollPane.setViewportView(content);
}
}
重现
只需运行代码,移动其中一个滚动条并检查System.out 的控制台输出。下图描述了在 x 轴上滚动条。
实际System.out 结果
产生了以下结果
java.awt.Rectangle[x=0,y=0,width=416,height=244]
java.awt.Rectangle[x=416,y=0,width=16,height=244]
java.awt.Rectangle[x=432,y=0,width=15,height=244]
java.awt.Rectangle[x=447,y=0,width=16,height=244]
java.awt.Rectangle[x=463,y=0,width=15,height=244]
预期结果
我本来希望边界的宽度保持不变。但它从 416 变为 16。
现在的问题是
有人知道为什么会发生这种情况,或者如何避免吗?
丢弃的 WAs
一种可能的解决方法是查找视口的视界。但如果可能的话,我想避免 Content 类进行任何此类查找。另一种选择是将信息传递给Content 类,但我也想避免这种情况。
【问题讨论】:
-
检查了类似的问题here;
Graphics上下文中的某些元素可能会随着绘制链的每次行程而改变。批判性地检查依赖剪辑区域的必要性可能会有所帮助。 -
@trashgod 哦,我会看看它并重新评估...
标签: java swing jscrollpane java-2d clip