Java:我是否只负责绘制(JScrollPane)Viewport View的可见区域?

时间:2012-04-17 00:23:27

标签: java swing user-interface jscrollpane

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

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

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

2 个答案:

答案 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()的含义/用法。