パネル
不透明なコンポーネント
Swing コンポーネントでも得に汎用的で利用頻度の高く
AWT における Canvas と Panel クラスの基本的な機能を引き継いでいる
javax.swing.JPanel クラスをここで紹介します
java.lang.Object
|
+--java.awt.Component
|
+--java.awt.Container
|
+--javax.swing.JComponent
|
+--javax.swing.JPanel
JComponent を継承しているこのクラスは、ごく簡単で簡素にまとめられています
まずこのクラスは独自のプロパティやイベントを発行しません
コンストラクタは、次のものが用意されています
JPanel()
JPanel(boolean isDoubleBuffered)
JPanel(LayoutManager layout)
JPanel(LayoutManager layout, boolean isDoubleBuffered)
layout には、このコンテナが使用するレイアウトを指定します
isDoubleBuffered が true の場合はダブルバッファリング方式を使用します
指定しない場合は、デフォルトで FlowLayout() のダブルバッファリングを使った JPanel になります
ここでいうダブルバッファリングとは、Swing 独自の仕様です
Swing コンポーネントは AWT と異なり、コンポーネントのちらつき防止のために
追加メモリを使用してダブルバッファリングによる処理を行います
これについては、後ほど詳しく解説いたします
注目すべき Swing コンポーネントの機能に、透過があります
Swing は軽量コンポーネントであるため、背景を透過させることができます
JPanel はデフォルトで不透明ですが
JComponent クラスのsetOpaque() メソッドでこれを設定できます
public void setOpaque(boolean isOpaque)
isOpaque に true を指定すると不透明、false を指定すると透明になります
true の場合は背景をバックグラウンドカラーで塗りつぶします
因みに現在の透明/不透明状態を得るには Component クラスの isOpaque() を使います
import javax.swing.*;
import java.awt.*;
public class Test extends JApplet {
public void init() {
Container contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
JPanelEx opq = new JPanelEx();
JPanelEx tp = new JPanelEx();
tp.setOpaque(false);
contentPane.add(opq);
contentPane.add(tp);
}
class JPanelEx extends JPanel {
public JPanelEx() {
setBackground(Color.red);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(1 , 1 , 98 , 98);
g.fillOval(20 , 20 , 60 , 60);
}
public Dimension getPreferredSize() {
return new Dimension(100 , 100);
}
}
}
左のパネルはデフォルトの状態で、背景が描画されますが
右のパネルは setOpaque() で false を指定し、背景を透過しています