JPanel の背景透過について
JPanel#isOpaque() の初期値は true。
opaque とは「不透明」という意味であり、isOpaque() の値が true であることは、パネルは不透明なため下にあるコンポーネントの色を透過せず、自らの背景色を表示することを意味する。
試しに以下のコードで検証。
package knowledgefort.labo.ui; import java.awt.*; import javax.swing.*; class OpaqueLabo { public static void main(String[] args) { JFrame _frame = new JFrame(OpaqueLabo.class.getName()); _frame.getContentPane().add(new Panel3()); _frame.setSize(300, 300); _frame.setVisible(true); } } final class Panel1 extends OpaqueLaboPanel { Panel1() { super.setBackground(Color.YELLOW); super.add(new BaseLabel("EAST"), BorderLayout.EAST); super.add(new BaseLabel("WEST"), BorderLayout.WEST); super.add(new BaseLabel("SOUTH"), BorderLayout.SOUTH); super.add(new BaseLabel("NORTH"), BorderLayout.NORTH); super.add(new BaseLabel("CENTER"), BorderLayout.CENTER); } } final class Panel2 extends OpaqueLaboPanel { Panel2() { super.setBackground(Color.GREEN); super.add(new BaseLabel("EAST"), BorderLayout.EAST); super.add(new BaseLabel("WEST"), BorderLayout.WEST); super.add(new BaseLabel("SOUTH"), BorderLayout.SOUTH); super.add(new BaseLabel("NORTH"), BorderLayout.NORTH); super.add(new Panel1(), BorderLayout.CENTER); } } final class Panel3 extends OpaqueLaboPanel { Panel3() { super.setBackground(Color.PINK); super.add(new BaseLabel("EAST"), BorderLayout.EAST); super.add(new BaseLabel("WEST"), BorderLayout.WEST); super.add(new BaseLabel("SOUTH"), BorderLayout.SOUTH); super.add(new BaseLabel("NORTH"), BorderLayout.NORTH); super.add(new Panel2(), BorderLayout.CENTER); } } abstract class OpaqueLaboPanel extends JPanel { OpaqueLaboPanel() { super.setLayout(new BorderLayout()); } } final class BaseLabel extends JLabel { BaseLabel(String aCaption) { super(aCaption); super.setHorizontalAlignment(SwingConstants.CENTER); } }
実行すると、以下の画面が表示される。
それぞれのパネルの背景色(Panel1:黄色、Panel2:緑、Panel3:ピンク)が表示され、Panel3 が Panel2 を内包し Panel2 が Panel1 を内包していることが確認できる。
次に、Panel1 と Panel2 を透明化して、Panel3 の背景色のピンクをが前面に表示されるように修正する。
… final class Panel1 extends OpaqueLaboPanel { Panel1() { super.setOpaque(false); // ←この行を追加して透明化する super.setBackground(Color.YELLOW); super.add(new BaseLabel("EAST"), BorderLayout.EAST); super.add(new BaseLabel("WEST"), BorderLayout.WEST); super.add(new BaseLabel("SOUTH"), BorderLayout.SOUTH); super.add(new BaseLabel("NORTH"), BorderLayout.NORTH); super.add(new BaseLabel("CENTER"), BorderLayout.CENTER); } } final class Panel2 extends OpaqueLaboPanel { Panel2() { super.setOpaque(false); // ←この行を追加して透明化する super.setBackground(Color.GREEN); super.add(new BaseLabel("EAST"), BorderLayout.EAST); super.add(new BaseLabel("WEST"), BorderLayout.WEST); super.add(new BaseLabel("SOUTH"), BorderLayout.SOUTH); super.add(new BaseLabel("NORTH"), BorderLayout.NORTH); super.add(new Panel1(), BorderLayout.CENTER); } } …
実行すると、以下の画面が表示される。
Panel1 と Panel2 が透明になり、Panel3 の背景色を透過することが確認できる。