Componentクラスは Objectクラスの直接のサブ・クラスで、
ImageObserverインターフェイスをインプリメントします。
java.awtパッケージに含まれます。
Componentクラスは、多くのコンポーネントのクラスのスーパー・クラスとなる
重要なクラスです。Componentクラス自身はオブジェクトを生成しません。
しかし Appletなどのクラスの多くのメソッドは Componentクラスの中で
定義されています。以下に解説するメソッドは、Appletを初めとするすべての
コンポーネントのオブジェクトの中で利用されます。
Componentクラスのオブジェクトの
サイズや色などの基本的な性質は publicな変数ではありません。
それらのデータにアクセスするためには、後述の専用のメソッドを利用します。
Componentクラスのメソッド
Componentクラスには、
引数の区別もすると全部で 100個以上のメソッドが定義されています。
メソッドの目的ごとに以下の項目のようにグループ分けして解説します。
- サイズのコントロールのメソッド
- レイアウトに関連するメソッド
- コンポーネントの状態に関連するメソッド
- 色とフォントのコントロールのメソッド
- グラフィックの表示に関連するメソッド
- Imageの取り扱いに関連するメソッド
- JDK1.0 からのスタイルのイベント処理に関連するメソッド
- JDK1.1 から追加された新しいスタイルのイベント処理に関連するメソッド
- オブジェクトの実装に関連するメソッド
- オブジェクトに関する情報を与えるメソッド
サイズのコントロールのメソッド
- public Dimension size()
- public void resize(int width, int height)
- public void resize(Dimension d)
- public void reshape(int x, int y, int width, int height)
- public Dimension getSize()
- public void setSize(int width, int height)
- public void setSize(Dimension d)
- public void setBounds(int x, int y, int width, int height)
size() は Componentのオブジェクトのサイズを得るのに、
resize() は Componentのオブジェクトのサイズを設定するのに用います。
Dimensionクラスは、public変数 width と height を持つ単純なクラスです。
したがって Component の横のサイズを利用しようとするなら、
たとえば次のような使い方をすることになります。
Button button = new Button("abc"); // Componentのサブ・クラスのオブジェクト
int w = button.size().width; // サイズを記憶する int型のデータ
resize()メソッドは実際には内部で reshape()メソッドを呼び出します。
reshape()メソッドは Componentの実装であるシステムのツール・キットを
直接呼び出して、
Componentのオブジェクトの
位置(親の内部での相対座標)とサイズの両方を一度に調整します。
reshape()のように Componentのオブジェクトの内部データを直接
設定するメソッドは、複数のスレッドから同時にアクセスされないよう
コンポーネントにロックをかけます。
これらのメソッド名は JDK1.1 からよりわかりやすい名前に統一することが
推奨されています。size() の代わりに getSize() 、
resize() の代わりに setSize()、
reshape() の代わりに setBounds() という同じ機能を持つメソッドが追加され
ています。今後はこれらの新しいメソッドを使うようにしてください。
レイアウトに関連するメソッド
- public Container getParent()
- public Point location()
- public Rectangle bounds()
- public void move(int x, int y)
- public void layout()
- public Point getLocation()
- public Rectangle getBounds()
- public void doLayout()
Componentのオブジェクトは、それをレイアウトするための「親」のオブジェクトを
持つのが普通です。親になることができるのは、内部の「子」のレイアウトを
管理する能力を備えた Container のオブジェクトです。
getParent()は、その親のオブジェクトを知るためのメソッドです。
親のオブジェクト内での相対位置を知るには location()メソッドを、
オブジェクト自身が占める領域を知るには bounds() メソッドを利用します。
なお、これらのメソッドは図形を表すクラスのオブジェクトになっています。
Pointは public変数として X座標と x と Y座標 y を持つ単純なクラスです。
Rectangleは public変数として、位置の情報を表す Pointクラスのオブジェクトと、
サイズの情報を表す Dimensionクラスのオブジェクトを持つ単純なクラスです。
Componentのオブジェクトを親のオブジェクトの内部で移動させるには、
move()メソッドを使います。move()は実際には中で reshape()メソッドを
呼び出しています。
layout()は Componentのオブジェクトの内部のレイアウトを実行するメソッドです。
このメソッドは Componentクラスでは特に何も定義されていません。
その内容は Containerクラスで初めて定義されます。
ただし他のメソッド( validate() )から呼び出されるべき存在であることは、
この Componentクラスの中で定義されています。
JDK1.1 から、
location() は getLocation()、
bounds()は getBounds()、
という同じ機能を持つ新しい名前のメソッドに置き換えることが推奨されています。
- public boolean inside(int x, int y)
- public Component locate(int x, int y)
- public Dimension preferredSize()
- public Dimension minimumSize()
- public boolean contains(int x, int y)
- public Component getComponentAt(int x, int y)
- public Dimension getPreferredSize()
- public Dimension getMinimumSize()
- public Dimension getMaximumSize()
inside()は、与えられた座標が Componentのオブジェクト自身の内部に含まれる
かをチェックするメソッドです。
(座標の原点は Componentのオブジェクト自身の左上端の点です。)
locate()は、与えられた座標に存在する Componentのオブジェクトを
知るためのメソッドです。内部に他のオブジェクトがなければ、自分自身が
返されます。
(やはり座標の原点は Componentのオブジェクト自身の左上端の点です。)
preferredSize()メソッドおよび minimumSize()メソッド、getMaximumSize()
メソッドは、
オブジェクトの最適なサイズおよび許される最小・最大のサイズを与えます。
主に親のオブジェクトによって利用されます。
JDK1.1 から、
inside() は contains()、
locate() は getComponentAt()、
preferredSize() は getPreferredSize()、
minimumSize() は getMinimumSize()、
という同じ機能を持つ新しい名前のメソッドに置き換えることが推奨されています。
(特に locate()メソッドは非常に誤解を招きやすい名称でしたが、改善されました。)
コンポーネントの状態に関連するメソッド
- public boolean isValid()
- public void validate()
- public void invalidate()
isValid()メソッドは、
レイアウトの処理が済んでいるかどうかをチェックします。
isValid() の値が true ならば処理は終わっています。
false ならばレイアウトのし直しが必要であることを示します。
サイズなどが変更されて
レイアウトのし直しが必要になった時には validate()メソッドを、
逆に対象から外すには invalidate() メソッドを呼び出します。
- public boolean isVisible()
- public boolean isShowing()
- public void show()
- public void hide()
- public void show(boolean cond)
- public void setVisible(boolean cond)
isVisible() と isShowing() は、
画面に表示された状態かをチェックするメソッドです。
isVisible()が親のオブジェクトの上に表示すべきかどうかをチェックするのに対し、
isShowing()は親のオブジェクトを含めて本当に表示されているかをチェックします。
したがって isVisible()が true であっても isShowing() が false である
可能性はあります。
show()メソッドはオブジェクトを表示させ、
hide()メソッドはオブジェクトを非表示の状態にします。
ただし boolean型の引数を持つ場合はに、
show(true) は show()と、show(false)はhide() と同じ意味になります。
show(),hide()の操作の対象となるのは、
isVisible() でチェックされる状態の方です。
hide()で isVisible()の値が false になっても、
オブジェクトがレイアウトされる領域は確保されたままです。
JDK1.1 から、
show(boolean) は setVisible(boolean)
という同じ機能を持つ新しい名前のメソッドに置き換えることが推奨されています。
- public boolean isEnabled()
- public void enable()
- public void disable()
- public void enable(boolean cond)
- public void setEnabled(boolean cond)
isEnabled() は Componentのオブジェクトが操作可能(イベント処理を
受け付ける状態)かどうかをチェックするメソッドです。
enable()メソッドはオブジェクトを操作可能な状態にさせ、
disable()メソッドはオブジェクトをの操作不可能な状態にします。
ただし boolean型の引数を持つ場合はに、
enable(true) は enable()と、enable(false)は disable() と同じ意味になります。
JDK1.1 から、
enable() と disable() は setEnabled()、
という同じ機能を持つ新しい名前のメソッドに置き換えることが推奨されています。
色とフォントのコントロールのメソッド
- public Color getForeground()
- public void setForeground(Color c)
- public Color getBackground()
- public void setBackground(Color c)
Componentのオブジェクトの前景色を得るには getForeground()メソッドを、
設定するには setForeground()メソッドを用います。
Componentのオブジェクトの背景色を得るには getBackground()メソッドを、
設定するには setBackground()メソッドを用います。
これらのメソッドでやり取りされるのは、すべて Colorクラスのオブジェクトです。
なお、前景色および背景色の初期値は親のオブジェクトから継承されます。
- public Font getFont()
- public void setFont(Font f)
- public FontMetrics getFontMetrics(Font f)
Componentのオブジェクトが内部に持つフォントを得るには getFont()メソッドを、
設定するには setFont()メソッドを用います。
これらのメソッドでやり取りされるのは Fontクラスのオブジェクトです。
フォントに対応する FontMetricsクラスのオブジェクトを得るには、
getFontMetrics()メソッドを用います。
このメソッドの対象となるのは Componentのオブジェクトの内部に記憶された
Fontクラスのオブジェクトとは限りません。
FontMetricsクラスのオブジェクトは、必ず Fontクラスのオブジェクトに
付随して生成され、その内容は不変です。
そのため setFontMetrics() のようなメソッドは存在しません。
なお、フォントの初期値は親のオブジェクトから継承されます。
グラフィックの表示に関連するメソッド
- public void paint(Graphics g)
- public void update(Graphics g)
- public void paintAll(Graphics g)
- public void print(Graphics g)
- public void printAll(Graphics g)
- public void repaint()
- public void repaint(long tm)
- public void repaint(int x, int y, int width, int height)
- public void repaint(long tm, int x, int y, int width, int height)
描画処理の内容を定義するメソッドが paint() と update() です。
paint()は Componentのオブジェクトの再描画が必要になった時
(最初に画面に現れる時も含む)に呼び出されます。
update()は repaint()メソッドによって間接的に呼び出されます。
paintAll()は Componentのオブジェクト自身も含め、
内部にある全ての Comonentのオブジェクトの
再描画を呼び出すメソッドです。
厳密に言うと再描画の時に最初に呼び出されるのは、
この paintAll()メソッドです。
paint()メソッドは paintAll()の中から呼び出されます。
print()およびprintAll()は、働きは paint()およびpaintAll()と同じです。
Componentのサブ・クラスの中で図形の表示とテキストの表示を使い分ける
ことを想定して用意されていると思われます。
Componentクラスでのデフォルトの設定は paint()の内容を呼び出すように
なっています。
また JDK 1.0の他のクラスでも print()メソッドを特別に再定義しているもの
はないようです。
paint(), update(), paintAll(), print(), printAll()のメソッドは
明示的に呼び出すことはできません。
引数の Graphicsクラスのオブジェクトは、
これらのメソッドが自動的に呼び出される時に外部から与えられるデータです。
repaint()は描画処理が必要であることをプログラム中で明示的に
要求するためのメソッドです。
repaint()は update()を呼び出すように要求を出します。
repaint() が要求を行っても即座に update()が呼び出されるとは限らない
点に注意してください。引数に「タイム・アウト」の時間を指定することも
可能です。(単位はミリ秒)
また、再描画の処理の対象となる範囲を4つの int型のデータの組で
指定することができます。4つのデータの意味は順に、
描画領域の X座標、Y座標、横のサイズ、縦のサイズです。
- public ColorModel getColorModel()
- public Graphics getGraphics()
getColorModel()はシステムのカラーモデルの情報を得るためのメソッドです。
JDK 1.0では ColorModelクラスは
ディスプレイのビット・デプスとα値の情報を提供します。
マシンのディスプレイの能力に合わせてきちんと処理を行いたい場合に利用します。
Graphicsクラスのオブジェクトは、
通常のプログラムの内部ではコンストラクタによって生成することはできません。
通常の描画処理の場合は必要なGraphicsクラスのオブジェクトは
外部から与えられます。
getGraphics()は、
何らかの理由で Graphicsクラスのオブジェクトに関する情報を
得たい場合に利用するメソッドです。
Imageの取り扱いに関連するメソッド
- public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h)
- public int checkImage(Image image, ImageObserver observer)
- public int checkImage(Image image, int width, int height, ImageObserver observer)
- public boolean prepareImage(Image image, ImageObserver observer)
- public boolean prepareImage(Image image, int width, int height, ImageObserver observer)
- public Image createImage(ImageProducer producer)
- public Image createImage(int width, int height)
imageUpdate()メソッドは、Imageクラスのオブジェクトから変更の通知を
受け取った時に呼び出されます。
変更があった場合 true、そうでない場合は false が返されます。
デフォルトの設定では、内部で repaint()メソッドを呼び出して
オブジェクトの再表示を行います。
(変更の通知を受け取るためには、ImageObserverとしての Componentの
オブジェクト自身を、Imageのオブジェクトに何らかの方法で登録しておきます。)
checkImage()メソッドはイメージの状態を明示的にチェックするために
利用します。引数に与える ImageObserver のオブジェクトは、
通常は Componentのオブジェクト自身です。
返値の int型の数値は、
その各ビットにイメージの状態を表す情報が含まれています。
各ビットの意味は ImageObserverインターフェイスに定数として定義されています。
(第5章参照)
prepareImage()メソッドは Componentのオブジェクトに固有のイメージデータ
が存在する場合に、その Imageクラスのオブジェクトを用意します。
返値はイメージが用意できたか否かを返します。
createImage()メソッドは新たに Imageのオブジェクトを生成します。
イメージの元となるデータは、
他の ImageProducer のオブジェクトによって提供されるか、
あるいはサイズのみ指定して空のオブジェクトを作ります。
イベント処理に関連するメソッド(JDK1.0 からのスタイル)
- public boolean mouseDown(Event evt, int x, int y)
- public boolean mouseUp(Event evt, int x, int y)
- public boolean mouseEnter(Event evt, int x, int y)
- public boolean mouseExit(Event evt, int x, int y)
- public boolean mouseDrag(Event evt, int x, int y)
- public boolean mouseMove(Event evt, int x, int y)
- public boolean keyDown(Event evt, int key)
- public boolean keyUp(Event evt, int key)
- public boolean action(Event evt, Object obj)
イベント処理のメソッドは、それぞれ該当するイベントが発生した時に
呼び出されます。(第3章参照)
返値が false であればイベントは親のオブジェクトに伝達されます。
action()メソッドはコンポーネントのオブジェクトのクラスによって
特定のイベントに対して呼び出されます。
その識別(イベントのフィルタリング)はコンポーネントの実装のレベルで
行われ、その内容に依存します。
action()メソッドの第2引数はアクションを検知したコンポーネントです。
親のオブジェクトにイベントが伝達されて処理される場合に参照されます。
- public boolean gotFocus(Event evt, Object obj)
- public boolean lostFocus(Event evt, Object obj)
- public void requestFocus()
- public void nextFocus()
キーボード・フォーカスを得た時に gotFocus()メソッドが、
失った時に lostFocus()メソッドが呼び出されます。
キーボード・フォーカスの有無を画面上にきちんと反映させたい場合は、
これらのメソッドの内容が必要になります。
メソッドの第2引数はフォーカスを得た(失った)コンポーネントです。
親のオブジェクトにイベントが伝達されて処理される場合に参照されます。
キーボード・フォーカスのコントロールは外部のサービスにまかせるのが普通です。
どうしても明示的にキーボード・フォーカスを要求する必要がある場合は、
requestFocus()メソッドを呼び出します。
キーボード・フォーカスを複数のコンポーネント間で次々移動できるような
設定がなされている時、
nextFocus()メソッドによって次のコンポーネントに強制的にフォーカスを移動させる
ことができます。
- public void deliverEvent(Event evt)
- public boolean postEvent(Event evt)
- public boolean handleEvent(Event evt)
これらのメソッドは Componentクラスの内部でのイベント処理を実現するため
の一番の基礎を形成するものです。
Componentのオブジェクトにイベントの伝達があると、
最初に呼び出されるメソッドが deliverEvent()です。
deliverEvent() はオブジェクト自身および内部のサブ・コンポーネントに
イベントを伝達する役割を担っています。
Componentクラスのデフォルトの定義では、deleverEvent() は
自分自身にイベントを伝達するため postEvent() を呼び出すのみです。
postEvent() メソッドは handleEvent()メソッドを呼び出します。
handleEvent()の処理が行われない(返値が false)場合には、
postEvent()は親のオブジェクトにイベントを転送します。
handleEvent()はイベントの種類を場合分けし、
それに対応するイベント処理のメソッドのいずれかを呼び出します。
(その返値を自分自身の返値として返す。)
上の仕組みは必要以上に込み入っているように見えるかもしれません。
しかし、このおかげで
Componentのサブ・クラスにおいてより柔軟な処理を保証することができます。
イベント処理に関連するメソッド(JDK1.1 からの新しいスタイル)
- public synchronized void addComponentListener(ComponentListener l)
- public synchronized void removeComponentListener(ComponentListener l)
- public synchronized void addFocusListener(FocusListener l)
- public synchronized void removeFocusListener(FocusListener l)
- public synchronized void addKeyListener(KeyListener l)
- public synchronized void removeKeyListener(KeyListener l)
- public synchronized void addMouseListener(MouseListener l)
- public synchronized void removeMouseListener(MouseListener l)
- public synchronized void addMouseMotionListener(MouseMotionListener l)
- public synchronized void removeMouseMotionListener(MouseMotionListener l)
新しいイベントモデルでは、イベント処理のメソッドはコンポーネントの
オブジェクトから分離されました。
上のメソッドは、それぞれのイベントの種類に対応する処理を行う
オブジェクト(Listenerのクラス)の登録と削除を行います。
- protected void processEvent(AWTEvent evt)
- protected void processComponentEvent(ComponentEvent evt)
- protected void processMouseEvent(MouseEvent evt)
- protected void processMouseMotionEvent(MouseEvent evt)
- protected void processKeyEvent(KeyEvent evt)
- protected void processFocusEvent(FocusEvent evt)
上のメソッドはいずれもコンポーネント内部での処理に用いられます。
コンポーネントにイベントが発生した時に、イベント処理を実行する
オブジェクト(Listener のクラス)のオブジェクトの適当なメソッドを
呼び出す働きをします。通常のプログラムでこれらのメソッドを
書き換える必要はありません。
オブジェクトの実装に関連するメソッド
- public ComponentPeer getPeer()
- public Toolkit getToolkit()
- public void addNotify()
- public void removeNotify()
awtパッケージのコンポーネントは、その実装をシステムのライブラリに
依存しています。あるいはプログラマーが用意した新しい実装を用いる
こともできます。
getPeer()メソッドは、
Componentのオブジェクトの実装を与えるオブジェクトを得るのに用います。
(より正確に言うのなら、実装とのインターフェイスを提供する
オブジェクトを得る。)
getToolkit()メソッドは、コンポーネントの実装を提供するツール・キットの
オブジェクト
(ツール・キットとのインターフェイスを提供するオブジェクト)を与えます。
addNotify() および removeNotify()は、
Componentのオブジェクトに実装のオブジェクトを持たせる、
あるいは実装のオブジェクトを失わせるためのメソッドです。
通常のプログラムでは、これらのメソッドを明示的に操作する必要はないでしょう。
オブジェクトに関する情報を与えるメソッド
- protected String paramString()
- public String toString()
- public void list()
- public void list(PrintStream out)
- public void list(PrintStream out, int indent)
paramString()は現在のComponentのオブジェクトの状態を
単一の文字列の情報で返します。
形式は "x,y,width,height(,invalid)(,hidden)(,disable)"というのが
デフォルトの設定です。
toString()メソッドは、オブジェクトを識別するための Stringクラスの
オブジェクトを返します。
このメソッドはサブ・クラスで必要に応じて再定義されます。
Componentクラスのデフォルトの設定は、「クラス名+paramString()の返値」です。
list()メソッドは、オブジェクトの変数名を指定した出力先(省略時は
標準出力)に表示します。
主としてアプリケーションのデバッグに利用します。
多数のコンポーネントのオブジェクトを階層的にレイアウトした場合のため、
出力時のインデントの深さを指定することもできます。
(実にきめ細かな配慮ですね。)