Java:我只需要绘制(JScrollPane)视口视图的可见区域吗?

4
我正在使用Java教程中如何使用JScrollPane(带有行/列标题)的示例。该示例使用JLabel的子类来显示Viewport View中的图像。我使用了用于显示行/列标题的示例代码(Rule.java example code),并对奇怪的结果感到困惑。最终,我删除了调用getClipBounds()的代码(显然用于确定可见的行/列标题区域以仅绘制该区域),并绘制了整个标题,问题得到解决。这意味着我现在正在绘制整个区域(在行/列标题和主Viewport中)。这让我觉得不是最优化的。
  1. 有人能解释一下为什么Java教程示例可以正常工作吗(除了源代码与示例中执行的代码不同)?
  2. 即使只有部分可见,我是否应该绘制整个窗格?
  3. 如何确定Viewport中整个对象的哪个区域是可见的(对于行/列标题和主Viewport),以便只绘制该区域?

更新:

我仍然不知道为什么这个示例可以工作,但是我发现如果我使用JComponent.getVisibleRect()而不是Graphics.getClipBounds(),事情似乎按照预期工作。不确定这是否是该方法的正确使用。


我们需要看到你的代码才能告诉你为什么它不能正常工作。 - Michael
2个回答

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
JComponent.getVisibleRect()是个好方法。显然我误解了getClipBounds()的意义/用法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接