4

JScrollPane (行/列ヘッダー付き) の使用方法の Java チュートリアルの例を使用しています。この例では、JLabel のサブクラスを使用して、ビューポート ビューに画像を表示しています。行/列ヘッダーを表示するためにサンプル コード ( Rule.java サンプル コード) を使用しましたが、奇妙な結果に戸惑いました。最終的に getClipBounds() の呼び出しを削除し (行/列ヘッダーのどの領域がその領域のみを描画するために表示されるかを判断するために使用されたようです)、ヘッダー全体を描画し、問題は解決しました。つまり、領域全体 (行/列ヘッダーとメイン ビューポートの両方) を描画していることになります。それは最適ではないと思います。

  1. Javaチュートリアルの例が適切に機能する理由を誰か説明できますか(ソースが例で実行されているものと同じではないことを除いて)?
  2. 部分的にしか表示されていなくても、ペイン全体をペイントするのは正しいですか?
  3. オブジェクト全体のどの領域がビューポート (行/列ヘッダーおよびメイン ビューポート) に表示されているかを判断して、その領域をペイントできるようにするにはどうすればよいですか?

アップデート:

この例が機能する理由はまだわかりませんが、Graphics.getClipBounds() の代わりに JComponent.getVisibleRect() を使用すると、期待どおりに機能するように見えることがわかりました。これがこのメソッドの正しい使用法であるかどうかはわかりません。

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 に答える