2012-05-02 22 views
3

私は最初のモニターの透明な背景にカウンタをインクリメントする必要がありますコードの次のスニペットがあります。画像に0が表示されると、それは問題なくレンダリングされますが、その後(1に達するとすぐに)ウィンドウは不透明な背景で再描画されます。Graphics2Dは透明な画像を消去しません

実例では愚かな例ですが、実際のユースケースを単純なコードに分割しただけです。

鍵がTestCanvasのpaintComponentメソッドであるかもしれないようだ。

g.setColor(new Color(0, 0, 0, 0)); 
g.clearRect(0, 0, getWidth(), getHeight()); 

私は仕事ができるか、これらの2行は完全に透明にし、それに与えられたエリアをクリアするために、描画色を設定する必要がありますから、カラー - しかし、これは最初の再描画を超えて保持しているようには見えません。

編集:clearRectの代わりにfillRectを使用すると、透明な四角形が既存の画像の上に塗りつぶされるだけでクリアされないため、クリアされません。図1に示すように、1上に重ね、その後2、0にオーバーレイされている等

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GraphicsEnvironment; 
import java.awt.Rectangle; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.SwingUtilities; 

public class LyricWindow extends JWindow { 

    private final TestCanvas canvas; 

    public LyricWindow(Rectangle area, boolean stageView) { 
     setBackground(new Color(0, 0, 0, 0)); 
     setArea(area); 
     canvas = new TestCanvas(); 
     canvas.setPreferredSize(new Dimension((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY()))); 
     add(canvas); 
     new Thread() { 

      public void run() { 
       for(int i = 0; true; i++) { 
        final int ii = i; 
        SwingUtilities.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          canvas.setText(Integer.toString(ii)); 
         } 
        }); 
        try { 
         Thread.currentThread().sleep(200); 
        } 
        catch(InterruptedException ex) {} 
        System.out.println(ii); 
       } 
      } 
     }.start(); 
    } 

    public final void setArea(final Rectangle area) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       if(canvas != null) { 
        canvas.setPreferredSize(new Dimension((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY()))); 
       } 
       setSize((int) (area.getMaxX() - area.getMinX()), (int) (area.getMaxY() - area.getMinY())); 
       setLocation((int) area.getMinX(), (int) area.getMinY()); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     LyricWindow w = new LyricWindow(GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0].getConfigurations()[0].getBounds(), false); 
     w.setVisible(true); 
    } 
} 

class TestCanvas extends JPanel { 

    private String text; 

    @Override 
    public void paintComponent(Graphics g) { 
     g.setColor(new Color(0, 0, 0, 0)); 
     g.clearRect(0, 0, getWidth(), getHeight()); 
     g.setColor(Color.RED); 
     g.drawString(text, 100, 100); 
    } 

    public void setText(String s) { 
     text = s; 
     repaint(); 
    } 
} 

答えて

2

私はペイントする前に正しい合成値を設定しなければなりませんでした。トリックは、その後、fillRect()を使用して、paintComponent()方法の開始に

((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC)); 

なかった追加します!

+1

奇妙なことに、このソリューションはWindowsでは動作しますが、Ubuntuでは動作しません。 :( – ferrerverck

2

g.fillRect(...)の代わりにg.clearRect(...)をしてみてください。私は一度同様の問題に遭遇したと思いますが、これは私のためにそれを解決したかもしれません。

私はBufferedImagesで問題を使用して私のオリジナルの解決策を見つけました。わからない白が黒ではないだろうが動作しますが、それを試して与えるかもしれない色理由:ColorクラスのJavadocをから

g.setBackground(new Color(255, 255, 255, 0)); 
g.clearRect(0, 0, width, height); 

は:

1.0または255のアルファ値は色であることを意味します完全に不透明な のアルファ値0または0.0は、色が完全に 透明であることを意味します。

+0

いいえ、fillRectはそれを消去していないようです(編集を参照)。 – berry120

+0

私の解決策をもう一度試してみてください。あなたの元の質問に似ていますが、私はBufferedImageをクリアするために私のために働いていました。 – Nate

+0

ありがとうございます、+1はうまくいくようですが、私は既に別の方法で解決していますが、私の答えは以下の通りです。 – berry120

0

あなたの色が完全に透明であれば、実際にクリアするのは何ですか?

アルファ値を0ではなく255に設定してみてください。clearRectで透明にすることが可能かどうかはわかりませんが問題は黒の(0, 0, 0)に「クリア」します。代わりにfillRectを試してみてください。

+0

答えをいただきありがとうございます。残念ながらfillRectは機能しません。 – berry120

0

これはちょっと古いですが、スーパークラスの関数を呼び出すことでキャンバスをクリアするために、すでに構築されたJPanelの機能を使うのはなぜですか?

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.setColor(new Color(0, 0, 0, 0)); 
    g.clearRect(0, 0, getWidth(), getHeight()); 
    g.setColor(Color.RED); 
    g.drawString(text, 100, 100); 
} 

これで描画するための完全に空白のグラフィックオブジェクトが残っています。

関連する問題