我正在使用Java Tutorials示例,了解如何使用JScrollPane(带有行/列标题)。该示例使用JLabel的子类在Viewport视图中显示图像。我使用示例代码显示行/列标题(Rule.java example code),并对奇怪的结果感到困惑。我最后删除了对getClipBounds()的调用(显然用于确定行/列标题的哪个区域可见以仅绘制该区域)并绘制整个标题,问题得到解决。这意味着我现在正在绘制整个区域(在行/列标题和主视口中)。这让我感到不理想。
更新
我仍然不知道为什么该示例有效,但我发现如果我使用JComponent.getVisibleRect()而不是Graphics.getClipBounds(),事情似乎按预期工作。不确定这是否正确使用此方法。
答案 0 :(得分:2)
请看下面的代码。我只是画了可见的部分。
@Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Rectangle view = new Rectangle();
if (getParent() instanceof JViewport) {
JViewport vp = (JViewport) getParent();
view = vp.getViewRect();
} else {
view = new Rectangle(0, 0, getWidth(), getHeight());
}
g2d.setColor(getBackground());
g2d.fillRect((int) view.getX(), (int) view.getY(), (int) view.getWidth(), (int) view.getHeight());
g2d.setColor(Color.YELLOW);
double x = view.getX();
double y = view.getY();
double w = view.getWidth();
double h = view.getHeight();
// draw Strings
for (StringShape ss : stringList) {
Rectangle sb = ss.getRectangle(g2d.getFontMetrics(ss.getFont()));
if (containShape(view, sb)) {
g2d.setFont(ss.getFont());
g2d.setColor(ss.getColor());
g2d.drawString(ss.getString(), (int) sb.getX(), (int) sb.getY());
}
}
}
答案 1 :(得分:1)
JComponent.getVisibleRect()就是诀窍。显然,我误解了getClipBounds()的含义/用法。