2013-03-15 5 views
5

私のアプリでは、大きなリストのカードを表示するポップアップダイアログが表示されます。 JPanelサブクラスの多くのJLabelコンポーネントに画像として表示します。次に、そのオブジェクトをJScrollPaneに入れて、カードの水平スクロールを許可します。透明な背景とコンテンツを持つJScrollPane

暗い背景を使用して未使用領域を透明にして、その背後にあるものが無効になっていることを示します。私はsetBackground(new Color(50, 50, 50, 200))を使用して私が望む外観を達成しましたが、その背後にあるコンテンツは再描画されないため、アーティファクトを取得します。

Artifacting when scrolling

がどのように私はこれを修正については行くだろう:

は、ここでは次のようになりますか?スクロールすると、その背後にあるコンテンツを再描画する方法を教えてください。

ありがとうございます。

答えて

6

モーメントの方程式から窓を取り除く。

JScrollPaneには、JViewportが含まれています。したがって、コンテンツペインを透明に、ビューポートを透明に、スクロールペインを透明に設定する必要があります。

これは、これらの各容器でsetOpaque(false)を使用することで実現できます。

これにより、再ペイントマネージャがバックグラウンドでペイントするようになります。

次の問題は、実際には「半透明」コンポーネントをサポートしていないことです(つまり、不透明または透明です)。

あなたは

+0

「JViewport」の呼び出しが良好です。その存在を知らなかった。私はそれを解決するために両方の答えの組み合わせを使用しました。 – MaxGhost

1

は、以下のことを試してみてください...スクロール中あなたにいくつかの救済を与える可能性がある(ビューポートの1はおそらく十分である)を主成分のpaintComponentメソッドをオーバーライドすることによってこれを実現することができます。 メインフレームが最大化されて になったり、復元されたときにも問題が発生する可能性があります。これらのイベントにはリスナーが必要で、同様の修正を する必要があります。

jScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
    jScrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     @Override 
     public void adjustmentValueChanged(final AdjustmentEvent e) { 
      sevenWondersframe.repaint(); 
     } 
    }); 
+0

ありがとうございます。私はそれを解決するために両方の答えの組み合わせを使用しました。 – MaxGhost

関連する問題