2009-09-06 26 views
3

タイトルはかなり自明です。私は、Javaを使ってレイヤーを重ねて2つのパネルを重ねて作りたいと思っています。最上位層にgraphics2dオブジェクトを含むJPanelが含まれているようにします。私はJPanelとgraphics2dの両方が透明な背景を持つようにしたいと思います(私はまだgraphics2dで描画されたコンテンツを表示したい)。どのようにそれを行うことができるか考えている人はいますか?Java JPanelとgraphics2dを透明にする方法は?

+0

ポストあなたのSSCCE。あなたは何をしているのか推測できません。 – camickr

答えて

5

JPanelでsetOpaque(false)を呼び出します.JPanelの背景をペイントしません。

(のJPanelのはは、コンポーネントなどのGraphics2Dオブジェクトが含まれていない - Graphics2DオブジェクトはJPanelのをペイントするために使用される) - あなたはGraphics2Dので得るためにオーバーライドしているものの方法に応じて、あなたはそれがpaintComponent(の場合)必要がありますread the JavaDocs for JComponent - 最初にsuper.paintComponent(g)を呼び出して、不透明度が得られるようにしてから、残りのペインティングを行います。

の作業例:

package com.stackoverflow.opaque; 

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class OpaqueExample extends JFrame { 

    private JLayeredPane layers; 
    private JPanel up, down; 
    private JButton toggleOpaque; 

    public OpaqueExample() { 
     layers = new JLayeredPane(); 

     down = new JPanel(); 
     down.setBackground(Color.GREEN); 
     down.setBounds(100, 100, 200, 200); 
     layers.add(down, new Integer(1)); 

     up = new JPanel() { 
      public void paintComponent(Graphics og) { 
       super.paintComponent(og); 

       Graphics2D g = (Graphics2D)og; 
       GradientPaint gradient = new GradientPaint(0, 0, Color.BLUE, 10, 0, 
          Color.WHITE, true); 

       Polygon poly = new Polygon(); 
       poly.addPoint(10, 10); 
       poly.addPoint(100, 50); 
       poly.addPoint(190, 10); 
       poly.addPoint(150, 100); 
       poly.addPoint(190, 190); 
       poly.addPoint(100, 150); 
       poly.addPoint(10, 190); 
       poly.addPoint(50, 100); 
       poly.addPoint(10, 10); 

       g.setPaint(gradient); 
       g.fill(poly); 

       g.setPaint(Color.BLACK); 
       g.draw(poly); 
      } 
     }; 
     up.setBackground(Color.RED); 
     up.setBounds(150, 150, 200, 200); 
     layers.add(up, new Integer(2)); 

     getContentPane().add(layers, BorderLayout.CENTER); 

     JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); 
     toggleOpaque = new JButton("Toggle Opaque"); 
     toggleOpaque.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       up.setOpaque(!up.isOpaque()); 
       layers.repaint(); 
      } 
     }); 
     buttonPanel.add(toggleOpaque); 

     getContentPane().add(buttonPanel, BorderLayout.EAST); 
    } 

    public static void main(String[] args) { 
     JFrame f = new OpaqueExample(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(500, 500); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 
} 
+0

まあ、私はちょうど普通の塗料を使用しています。 私は、graphics2dのない単一のjPanelだけを試してsetOpaque(false)を設定すると、まだ下のJPanelを隠しています。私は途中でJLayeredPaneを使用しています。 – vondip

+0

Swingコンポーネントのpaint()ではなく、paintComponent()をオーバーライドする必要があります(特殊な場合を除く)。残りの部分について何を言いたいのか分かりません...コードが投稿されていないので、あなたがしていることを正確にはわかりません。私は動作する短い例を投稿します。 – Nate

+0

こんにちはネイト、 ここでプライベートメッセージを送信できるかどうかチェックしています。より良い方法であなたに感謝したがっていました。あなたのサンプルコードはシンプルでわかりました。私はgraphics2dを使っていて、clearRectを呼んでいることに気付いていました。私には常に白い画面が表示されていました。これを変更してコードサンプルに調整した後、それは機能しました!もう一度、ありがとう。 – vondip

関連する問題