2010-12-10 16 views
0

固定された大きな(しかし固定された)ベクトルイメージを描画し、ビューポート(絶対位置ではない)に対して相対的に表示するテキストのイメージをオーバーレイするスイングコンポーネントがあります。エクセル(下記に示す)内のラベル:java swingのクリッピングの問題

Header 
-- [some stuff] ----- [ some stuff] ---- 
Header2 
----- [some stuff] ----- [ some stuff] ---- 

これは、左から右にスクロールしたときを除いて正常に動作します。

public void paintComponent(Graphics graphics) { 
    Graphics2D g = (Graphics2D)graphics; 
    Shape oldClip = g.getClip(); 

    Rectangle clipBounds = getVisibleRect(); 
    g.setClip(clipBounds); 

    drawMyImage(); 
    drawMyHeaders(); 

    g.setClip(oldClip); 
} 

はしかし、これは動作するようには思えません。しかし、これは動作するように表示されません - 私は、ビューポート全体が常に描かれているように、paintComponent()メソッドでは、可視光領域にクリップの境界を設定しよう可視領域が正しい形状であることがわかりますが、クリップを設定しても効果はありません。私に何ができる?

clip: java.awt.Rectangle[x=1762,y=0,width=57,height=182] // clipped while scrolling 
vis: java.awt.Rectangle[x=1762,y=0,width=582,height=182] // what I want to paint 
+2

'paintComponent'で' setClip'を使用しないでください!クリッピング領域はSwingによって使用されます。 –

+0

明らかに私はより良いアプローチを求めていますが、可視領域に描画を設定してから復元することは害ではありません。スイングは、スクロール中にクリップが汚れた領域に固くセットされているように見えますが、おそらくグラフィックスのサブコンテキストを提供しています。 – Justin

答えて

2

あなたは、グラフィックスは、あなたのヘッダーにオブジェクトを渡していないので、彼らはおそらく文句を言わないあなたのクリッピング形状が設定されている他の何かによって塗装する必要があります。

コメントとして、paintComponentでsetClipを使用しないでください。クリッピング領域はSwingによって使用されます。

スクロールコンポーネントの上にオーバーレイコンポーネントが重ねられているようにしたいと思われるようです。

+0

すべてのペイントは、1つのタイムラインコンポーネントの一部としてペイントされます。ヘッダーの位置の計算は、タイムラインのペイント中に行われます。つまり、2番目のスイングコンポーネントを上にオーバーレイしたくはありません。 – Justin

+0

オーバーレイコンポーネントは、スクロールペインで適切に描画されるように、その位置をどのように設定しますか? – Justin

+0

@Justinレイアウトマネージャがないと仮定し、スクロール領域が動いたときに親コンポーネント内の位置を設定するだけです。あなたは水平スクロールと垂直スクロールを分割することができますが、それは副作用を伴う可能性があります。 –

関連する問題