6.2 コンポーネントへの描画
描画する領域を
の jPanel2 内に限定したアプレットを作ってみましょう.
アプレットでは親クラスの関数はオーバーライドするときしか書かないので,全体の処理の流れは
[5-17] を参照してください.swing のコンポーネントに描画するときは [5-18] に書かれている
ように paintComponent() を用います.また [5-19] のように描画クラスを独立させると,デスク
トップアプリケーションにもそのまま流用できます.
//------------------------------------------
//Draw.java
package draw;
import java.awt.*; // キー入力
public class Draw extends javax.swing.JApplet {
Fig fp; // キー入力
/** Initializes the applet Draw */
public void init() {
try {
java.awt.EventQueue.invokeAndWait(new Runnable() {
public void run() {
initComponents();
fp = new Fig(); // キー入力
jPanel2.add(fp); // キー入力
}
});
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void paint(Graphics g){ // キー入力
fp.paintComponent(g); // キー入力
} // キー入力
@SuppressWarnings("unchecked")
//
********** 省略(編集不能の自動生成部: 70 行)**********
}//
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
fp.x += 5; fp.y -= 5; fp.repaint(); // キー入力
}
private java.awt.Canvas canvas1;
private javax.swing.JButton jButton1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
}
//------------------------------------------
//Fig.java
package draw;
import javax.swing.* ;
import java.awt.*;
public class Fig extends JPanel {
int x, y;
public Fig(){
setBackground(Color.yellow);
setBounds(20, 20, 200, 200);
x = y = 0;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 0, 100, 100);
g.setColor(Color.red);
g.drawOval(50+x, 50+y, 100, 100);
}
}
//------------------------------------------
//draw.html (全角の不等号は半角にしてください)
<HTML><BODY>
<applet height=250 width=400 code="Draw.class"></applet>
</BODY></HTML>
//------------------------------------------
draw.html の表示内容は
のようになります.このプログラムで Fig クラスのオブジェクトを jPanel2 に収納しているのは
デザイン画面でプロパティ(サイズ,背景色,枠 etc)の設定をするためです.分かり易いように
Fig と JPanel のサイズ,背景色を変えていますが,サイズを合わせて Fig のプロパティを規定値
にすると楽です.
jButton1 をクリックすると円が移動します.このイベントハンドラはデザイン画面で MouseClicked
のイベントを選ぶとキー入力は「fp.x += 5; fp.y -= 5;」だけで済みます.
補足: JApplet の代わりに JFrame を用いるときも同様です.ContentPane は不変であることは
jButton2 を追加し MouseClicked で getContentPane().setBackground(Color.cyan); を実行
させれば確認できます.
実行用ファイルは http://www.hakurei-isl.org/m-miyata/applet/draw.html にあります.
資料 [5-11]~[5-16] は [6-1]~[6-6] と読み変えてください.(不等号の処理が面倒なので
手抜きします.幸い「このプログラムは応答していません」になりませんが,太字のタグが消えたり
CRLF が LF になる等の煩わしさは残っています.)
[6-7] javadrive: Applet(アプレット)入門 > アプレットの基本 > アプレットの基本メソッド
http://www.javadrive.jp/applet/basic/index6.html
init, start, stop, destroy, paint, repaint, update.
[6-8] JAVA塾:Java入門 > 第4篇 Javaアプレット > アプレットの記述
http://www1.megaegg.ne.jp/~yasu/Programmer's%20Page/applet/appletKijyutu.html
contentPaneという窓で処理されます。直接JFrameやJAppletにコンポーネントを置くことはしません。
[6-9] 5.描画エリアを単独のクラスにしよう
http://light21.s26.xrea.com/paintjava/chap05.html
※コメント投稿者のブログIDはブログ作成者のみに通知されます