Swing コンポーネント上に描画するには、
描画したいコンポーネントのクラスを継承したクラスで、
メソッド paintComponent(Graphics g) をオーバーライドし、
パラメータで渡された g に対して Graphics クラスのメソッドで描画をします。
オーバーライドした paintComponent の先頭で、このコンポーネントの土台を描画するために、
super.paintComponent(g) を呼び出しておきます。
paintComponent は、このコンポーネントの描画が必要になったとき
( たとえば最初に表示する時、最小化した後の再表示、
他のウィンドウの下に隠れた後に再度アクティブになった時、
コンポーネントのサイズが変更された時 等)Javaシステムから呼び出されます。
paintComponentをプログラムから呼び出してはいけません。描画をしたい場合は、
paintComponent をオーバーライドしたクラスの repaint() メソッドを呼び出します。
【例1】
直線と円を書いてみましょう。
ソース・プログラム Graph7.java
描画の手順
- java.awt.Graphics を import しましょう。(3行目)
- JPanel を 継承したクラスを宣言します。(6行目〜)
- public void paintComponent(Graphics g) を 定義します。(14行目〜)
- super.paintComponent() で JPanel の部分の描画をします。(15行目)
- g に対して色の設定、描画をします(16〜19行目)
最小化したり、他のウィンドウの下に隠したりした後、
再表示をして画がくずれないことを確認してください。画面のサイズを変えてみましょう。
また、15行目をコメントにすると何がおきるかを確認しましょう。
【例2】
マウスでクリックした場所に円を書いてみましょう。
ソース・プログラム Graph8.java
プログラムの概要
- JPanel を継承したクラスを定義します。(6行目〜)
- マウスリスナの実装する旨を宣言します。(7行目)
implements MouseListener を書くことによって、
27〜39行目に書いた mouse... というメソッドが
マウスリスナのメソッドとして認識されるようになります。
MouseListener インターフェースを実装するクラスで
定義しなければならないメソッドは次の5つです。
- mouseEntered ― マウスがコンポーネントの中に入った時の処理を記述する。
- mouseExited ― マウスがコンポーネントの外に出た時の処理を記述する。
- mousePressed ― マウス・ボタンが押された時の処理を記述する。
- mouseReleased ― マウス・ボタンが離された時の処理を記述する。
- mouseClicked ― マウスがクリックされた時の処理を記述する。
ボタンを押した場所と離した場所が異なる(ドラッグした)場合
には呼ばれない。
このプログラムではマウスが押された時に円を書き、
それ以外は何もしないことにします。
- マウスがクリックされた位置を保存する変数を宣言します。(8〜9行目)
クリックが一回もされていないことを示すために、x の初期値を負にしておく。
- コンストラクタの宣言。マウスリスナを登録し、背景色を設定します。(14〜17行目)
- paintComponent の宣言(19〜25行目)
- 親(JPanel)を描画します。(20行目)
- 最初にマウスボタンが押される前は描画しない(21行目)
- 描画色を設定し、円を描画します(22〜23行目)
- マウスボタンが押された場合の処理(33〜37行目)
- マウスカーソルがある位置を取得し、変数に保存(34〜35行目)
- このコンポーネントを描画する(36行目)
repaint を呼び出すと、このコンポーネントの Graphics をパラメータにして、
上記の paintComponent がコールバックされます。
- それ以外の MouseListener の メソッドでは何もしません。(27〜31、39行目)
- main メソッドでウィンドウを作成し(42〜45行目)、
このパネルGraph8 を生成し、ウィンドウに貼り付けます(46行目)。
ウィンドウの大きさを200×200ピクセルにし表示します(47〜48行目)。