4

我正在使用 Java 教程示例来说明如何使用 JScrollPane(带有行/列标题)。该示例使用 JLabel 的子类在视口视图中显示图像。我使用示例代码来显示行/列标题(Rule.java 示例代码)并且对奇怪的结果感到困惑。我终于删除了对 getClipBounds() 的调用(显然用于确定行/列标题的哪个区域可见,仅绘制该区域)并绘制整个标题,问题得到解决。这意味着我现在正在绘制整个区域(在行/列标题和主视口中)。这让我觉得不是最优的。

  1. 谁能解释为什么 Java 教程示例可以正常工作(除了源与示例中执行的不同)?
  2. 即使它只是部分可见,我绘制整个窗格是否正确?
  3. 如何确定整个对象的哪个区域在视口中可见(对于行/列标题和主视口),以便我可以绘制该区域?

更新:

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

4

2 回答 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());

        }
    }

}
于 2012-05-14T14:34:08.647 回答
1

JComponent.getVisibleRect() 是诀窍。显然我误解了 getClipBounds() 的含义/用法。

于 2012-11-16T20:45:50.193 回答