4.1 コンポーネントのプロパティ
4.1.1 性質を設定・取得するメソッド
ボタンやラベルなど、画面に表示される全ての UI 要素はコンポーネントと呼ばれ java.awt.Component クラスを継承しています。Component クラスはアプレットやアプリケーションウィンドウも含めて、あらゆる GUI オブジェクトが継承する抽象スーパークラスです。Component オブジェクトはそのコンポーネントの基本的なプロパティを提供しています。コンポーネントが提供する基本的なプロパティは、コンポーネントの位置やサイズ、前景色や背景色、フォント、ロケール、名前などが存在します。
java.lang.Object | +--java.awt.Component
public abstract class Component extends Object implements ImageObserver, MenuContainer, Serializable
例えば、コンポーネントの背景は設定されている背景色に基づいて塗りつぶされますし、表示されるテキストは設定されているフォントが使われます。実は、paint() メソッドで受け取る Graphics オブジェクトの色やフォントは、コンポーネントに設定されているプロパティがデフォルトになっています。
新しいコンポーネントを設計する場合、この事実は重要です。コンポーネントの設計者は、Graphics オブジェクトの現在の色を変更して図や文字を描画するのではなく、コンポーネントに設定されている前景色や背景色などのプロパティ値に基づいてコンポーネントを描画するべきなのです。そうすれば、コンポーネントの利用者は新しいコンポーネントの独自の仕様などを学習する必要がなくなります。コンポーネントのテキストの色を変更したいときは Component クラスのメソッドを使って前景色を変更するだけで、目的のデザインを実現できるからです。
public Point getLocation() | コンポーネントの現在の位置を返す。 |
public void setLocation(int x, int y) | コンポーネントを指定した座標に移動する。 |
public void setLocation(Point p) | |
public Dimension getSize() | コンポーネントの現在のサイズを返す。 |
public void setSize(int width, int height) | コンポーネントを指定したサイズに変更する。 |
public void setSize(Dimension d) | |
public Rectangle getBounds() | 親コンポーネントを基準に、コンポーネントの境界を返す。 |
public void setBounds(int x, int y, int width, int height) | コンポーネントを指定された矩形に基づいて移動し、サイズを変更する。 |
public void setBounds(Rectangle r) | |
public int getX() | コンポーネントの現在の位置の X 座標を返す。新しいヒープを割り当てないため getLocation() や getBounds() よりも適切です。 |
public int getY() | コンポーネントの現在の位置の Y 座標を返す。新しいヒープを割り当てないため getLocation() や getBounds() よりも適切です。 |
public int getWidth() | コンポーネントの現在の幅を返す。新しいヒープを割り当てないため getSize() や getBounds() よりも適切です。 |
public int getHeight() | コンポーネントの現在の高さを返す。新しいヒープを割り当てないため getSize() や getBounds() よりも適切です。 |
public boolean isVisible() | コンポーネントが可視かどうかを判定する。 |
public void setVisible(boolean b) | コンポーネントを可視または不可視にする。 |
public boolean isEnabled() | コンポーネントが使用可能であるかどうかを判定する。 |
public void setEnabled(boolean b) | コンポーネントを使用可能または使用不可能にする。 |
public String getName() | コンポーネントの名前を返す。 |
public void setName(String name) | コンポーネントの名前を設定する。 |
public Locale getLocale() | コンポーネントのロケールを返す。 |
public void setLocale(Locale l) | コンポーネントのロケールを設定する。 |
public Color getForeground() | コンポーネントの前景色を返す。 |
public void setForeground(Color c) | コンポーネントの前景色を設定する。 |
public Color getBackground() | コンポーネントの背景色を返す。 |
public void setBackground(Color c) | コンポーネントの背景色を設定する。 |
public Font getFont() | コンポーネントのフォントを返す。 |
public void setFont(Font f) | コンポーネントのフォントを設定する。 |
public Cursor getCursor() | コンポーネントのカーソルを返す。 |
public void setCursor(Cursor cursor) | コンポーネントのカーソルを設定する。 |
表1は Component クラスの主なプロパティを設定または取得するメソッドです。set*() メソッドと get*() または is*() メソッドが対になっていることがわかります。オブジェクト指向全般、特に設計論や XML の世界では、オブジェクトの状態や性質を表す値を属性と呼ぶこともありますが、Java の世界では、特にオブジェクトの状態や性質を表す名前と値の組み合わせをプロパティと呼びます。
例えば、コンポーネントの前景色は foreground という名前と Color オブジェクトの組み合わせで 1 つのプロパティであると考えることができます。AWT コンポーネントは set*() メソッドや get*() または is*() を用いて Component クラスの内部で保有されている非公開のフィールドにアクセスし、プロパティの値を変更したり、取得したりできす。
Visible プロパティは、コンポーネントが見えるか見えないかを決定します。通常、トップレベルウィンドウに使うことはなく、主にボタンなどの子コンポーネントに対して使います。見えないコンポーネントはユーザーの入力を受けることはありません。
Enable プロパティは、コンポーネントがユーザーと対話可能かどうかを表します。これが false の場合、コンポーネントはユーザーからの入力を受けることはありませんが Visible プロパティが false の状態とは異なり可視状態です。通常、コンポーネントが有効ではないことをユーザーに知らせるために、グレー表示にするなどの外観の変化も発生します。
Foreground や Background、Font プロパティは先ほど説明したように、paint() メソッドに渡される Graphics オブジェクトのデフォルトの値に影響します。paint() メソッドが発生する直前に背景色でコンポーネントが塗りつぶされ、Graphics オブジェクトの現在の色とフォントがコンポーネントに設定されている値を使って初期化されます。
import java.applet.Applet; import java.awt.*; //<applet code="Test.class" width="400" height= "400"></applet> public class Test extends Applet { public void init() { setForeground(Color.WHITE); setBackground(Color.BLACK); setFont(new Font("Serif" , Font.ITALIC , 20)); } public void paint(Graphics g) { g.drawString("Width=" + getWidth() + ",Height=" + getHeight(), 0 , 20); } }
コード1はコンポーネントの設定が paint() メソッドに渡される Graphics オブジェクトの初期値に影響を与えていることを証明するアプレットです。アプレット起動時に init() メソッドが実行され、アプレットの前景色、背景色、フォントが変更されています。Applet クラスは Component クラスのサブクラスであることを思い出してください。
実行結果を見ると、プログラムは paint() メソッドで受け取った Graphics オブジェクトでは現在の色やフォントを変更せずにデフォルトのままで文字列を描画していますが、デフォルトの色とフォントが init() メソッドでコンポーネントに対して設定した色とフォントになっていることが確認できます。