2

別の画像の上にあるColor(0,0,0,0)で何かを描くと、表示される色はJFrameの背景であり、そのすぐ下の画像ではないことに注意しました。

解決策を見つけるのに役立つ理由は?

ありがとう!!

編集:円を参照してください。灰色の領域(角)は透明である必要がありますが、代わりにJFrameの色ではありません。 代替テキストhttp://img72.imageshack.us/img72/9657/transparency.png

そして、これが円を描くためのコードです:

public void paint(final Graphics g){
        super.paintComponent(g);
        最終的なGraphics2Dg2=(Graphics2D)g;

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING、RenderingHints.VALUE_ANTIALIAS_ON);

        if(unitImage == null){

            unitImage =(BufferedImage)(createImage(30、30));
            最終的なGraphics2Dgc= unitImage.createGraphics();
            gc.setRenderingHints(rh);
            gc.setColor(outsideColor);
            gc.fillOval(0、0、diameter、diameter);
            gc.setColor(middleColor);
            gc.fillOval(直径/ 6、直径/ 6、(直径/ 3)* 2、(直径/ 3)* 2);
            gc.setColor(innerColor);
            gc.fillOval(直径/ 3、直径/ 3、直径/ 3、直径/ 3);
        }

        g2.drawImage(unitImage、null、0、0);

Alphacompositesをいじってみましたが、それは解決策ではないと思います。だから私は私が信じるこのすべての新しい情報を追加しました、あなたたちが私に別のヒントを与えるのを助けるでしょう。

4

3 に答える 3

7

描画する前に AlphaComposite を設定しましたか?

Graphics2D g2d = (Graphics2D)g; //Some graphics object
//Save the original
Composite original = g2d.getComposite();
//Set to semi translucent
Composite translucent = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
g2d.setComposite(translucent);

//Draw

//Set back to original
g2d.setComposite(original);

免責事項: テスト済みのコードノート

于 2010-04-15T03:46:24.257 に答える
6

@Chuk Leeは正しいです。変更しない限り、デフォルトのGraphics2DコンポジットはAlphaComposite.SrcOver. この便利なツールは、選択したルールと指定した色とアルファのペアの合成結果を表示します。

補遺: 1 つのアプローチはpaintComponent()、マップと円の両方をオーバーライドしてレンダリングすることですが、アルファをクリアすることでコーナーを透明にすることができる場合があります。

...
gc.setRenderingHints(rh);
gc.setComposite(AlphaComposite.Clear);
gc.fillRect(0, 0, diameter, diameter);
gc.setComposite(AlphaComposite.Src);
gc.setColor(outsideColor);
...

createImage(30, 30)に関係しdiameterますか? どのコンポーネントをオーバーライドpaint()して呼び出しsuper.paintComponent(g)ますか?

于 2010-04-15T04:38:29.737 に答える
2

不透明度0でペイントしています。必要な黒の場合は、Color(0,0,0,255)を使用します。

アップデート

申し訳ありませんが、あなたの質問を誤解しました。投稿に追加したコードを読んだら、小さなターゲットは、親コンポーネントに描画されたマップの上に配置されたコンポーネントであると思います。

透明性を確実に使用するには、次の2つが必要です。

  1. ターゲットコンポーネントのコンストラクターでsetOpaque(false)を呼び出す必要があります
  2. バッキングストアなしでターゲットを直接描画するか、RGBA画像を使用します。

    unitImage = new BufferedImage(30、30、BufferedImage.TYPE_INT_ARGB);

于 2010-04-15T05:54:09.913 に答える