記憶庫

自分用のメモです。

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 の背景色を透過することが確認できる。