Java 言語 第 10 回ウインドウ型アプリケーション (1) 知的情報システム工学科 久保川淳司 kubokawa@me.it-hiroshima.ac.jp
前回の課題 (1) ボーダーレイアウト, グリッドレイアウト, パネルを使用して, 電卓風のボタンを実現する BorderLayout で NORTH, CENTER, SOUTH に分割 NORTHにはテキストフィールドを設定 CENTERにはパネルを使って9つのボタンを設定 Sourthにはパネルを使って2つのボタンを設定 0~9のボタンで数字が入力され,Clearボタンで表示がクリアされる
課題 (2) import java.applet.applet; import java.awt.*; import java.awt.event.*; /* <APPLET CODE="JaPanelKadai.class" WIDTH=200 HEIGHT=120> </APPLET> */ public class JaPanelKadai extends Applet implements ActionListener { Button bt0, bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, btclr; TextField txt1; String ss = ""; public void init() { // BorderLayout を設定し NORTH,CENTER,SOUTH だけを使う // NORTH にテキストフィールドを設定する // CENTER にパネルを設定し内部を 3 行 3 列の GridLayout にする // p_center.setlayout(new GridLayout(3, 3)); パネルのレイアウト設定 // 1~9 のボタンを設定 // 1~9 のボタンをリスナ登録 add(p_center, BorderLayout.CENTER); // CENTER に登録 // SOUTH にパネルを設定し内部を 1 行 2 列の GridLayout にする // p_center.setlayout(new GridLayout(1, 2); パネルのレイアウト設定 // 0, Clear ボタンを設定 // 0, Clear ボタンをリスナ登録 add(p_south, BorderLayout.SOUTH); // SOUTH に登録 public void actionperformed(actionevent e) { // ボタンクリック処理 Button btn = (Button)e.getSource(); if (btn == btclr) {ss = ""; else {ss = ss + btn.getlabel(); update(this.getgraphics()); public void paint(graphics g) { // 表示する txt1.settext(ss);
ウインドウ型アプリケーション
ウインドウ型アプリケーションの基礎知識 (1) ウインドウ型アプリケーション Windows 上の一般的なアプリケーション形式 Web ブラウザや appletviewer を使わなくても, そのプログラム単独で動作させることができる ( ただし,JVM は必要 ) Java アプレットとの違い Java アプレットはネットワーク上で動くことを前提としているため, セキュリティの観点から Sandbox( 砂場 ) と呼ばれる保護された領域内でプログラムを動作させるため, ローカルファイルへのアクセスが制限されている ウインドウ型アプリケーションは JVM(Java 仮想マシン ) 上で動くのは同じであるが, 通常のアプリケーションと同じようにローカルファイルへの入出力などの操作が可能である
ウインドウ型アプリケーションの基礎知識 (2) 基本構成 Java アプレットの時には Applet クラスを継承したクラスを作成していたが, ウインドウ型アプリケーションでは Frame クラスを継承してクラスを作成する class MyPrg extends Frame {... 表示させる窓のサイズは以下のように設定する xxx.setsize( 横サイズ, 縦サイズ ); // xxx は Myprg クラスのオブジェクト ( 注 ) アプレットでの窓のサイズは,HTML で記述していた /* <APPLET CODE="JaPanelKadai.class" WIDTH=200 HEIGHT=120> </APPLET> */
ウインドウ型アプリケーションの基礎知識 (3) 窓への描画 窓への描画はこれまでのアプレットとほとんど同じ方法 (paint メソッド ) で実現できる public void paint(graphics g) { g.drawstring(...); g.drawoval(...);... 部品の配置 Frame ではデフォルトで BorderLayout が用いられる (Applet のデフォルトは FlowLayout) Applet の時と同様に, 自由にレイアウトを変更することができる また,Panel も使用することができる
ウインドウ型アプリケーションの基礎知識 (4) イベント処理, 部品の処理 マウスクリックなどに対応するイベント処理やボタンの処理等は Applet の場合と同じ タイトル文字 settitle("my アプリケーション "); // タイトル文字列 背景色の設定 setbackground(color.yellow); // 背景を黄色にする 窓の表示 xxx.setvisible(true); // フレームを表示する xxx.setvisible(false); // フレームを非表示にする 窓を閉じる addwindowlistener(new WindowAdapter() { // 閉じるボタンが押された時 public void windowclosing(windowevent e) { System.exit(0); );
ウインドウ型アプリケーションの作成 (1) 文字列表示プログラム 文字列を表示するアプレットをウインドウ型アプリケーションに変更する 注意点として, アプレットの座標はウインドウのタイトル下のメインウインドウの座標で指定されていたが, フレームの場合はタイトルバーの端から座標を計算することになるため,y 座標の値を大きくしておく必要がある g.drawstring(ss, 10, 20); // アプレットの場合 g.drawstring(ss, 10, 50); // フレームの場合
import java.awt.*; import java.awt.event.*; class MyFrame extends Frame { // Frameを継承して窓を作成する public ウインドウ型アプリケーションの作成 MyFrame(String title) { (2) ファイルネーム JaFrmCh.java として作成 settitle(title); // タイトル設定 addwindowlistener(new WindowAdapter() { // 閉じるボタン対応 public void windowclosing(windowevent e) { System.exit(0); // 終了する ); public void paint(graphics g) { String ss = "ABCabc 文字列 "; g.drawstring(ss, 10, 50); // デフォルトのフォントで表示 g.setfont(new Font("Serif", Font.BOLD, 24)); g.drawstring(ss, 10, 80); // Serif 太字 24 ポイントを設定 g.setfont(new Font("MS ゴシック ", Font.PLAIN, 24)); g.drawstring(ss, 10, 110); // ゴシック 普通 24 ポイントを設定 g.setfont(new Font("MS 明朝 ", Font.ITALIC, 36)); g.drawstring(ss, 10, 150); // 明朝 斜体 36 ポイントを設定 public class JaFrmCh { public static void main(string args[]) { MyFrame frm = new MyFrame(" 文字列の出力 "); // フレームの生成 frm.setsize(300, 200); // 窓サイズ横 縦 frm.setvisible(true); // フレームを表示する
ウインドウ型アプリケーションのコンパイル実行 プログラム編集 notepad javacでのコンパイル javac プログラム実行 javaw ( ウインドウ用 ) Eclipse では今までと同じやり方
フレームクラスの説明 (1) フレームクラスで定義されている主要なメソッド Image geticonimage() 最小化したときのアイコンイメージを返す MenuBar getmenubar() このフレームのメニューバーを返す int getstage() フレームの状態を返す アイコンなら Frame.ICONIFIED, 通常なら, Frame.NORMAL String gettitle() フレームのタイトルを返す boolean isresizable() ユーザがフレームサイズを変更できるかどうかを示す void remove(menucompornent m) 指定されたメニューをこのフレームから削除する void setmenubar(menubar mb) メニューバーを設定する
フレームクラスの説明 (2) void seticonimage(image image) 最小化した時のアイコンイメージを設定する void setresizeable() ユーザがフレームサイズを変更できるようにする void setstate(int state) フレームの状態を設定する (Frame.ICONIFIED, Frame.NORMAL) void setsize(int width, int height) フレームのサイズをwidth, heightに設定する void setvisible(boolean b) フレームを表示 (true), 非常時 (false) に設定する void addwindowlistener(windowlistener l) ウインドウイベントを受け取るためのウインドリスナを追加する void removewindowlistener(windowlistener l) 指定されたウインドウリスナを削除する void dispose() ウインドウを開放する 非表示にするとともに, リソース開放する
フレームクラスの説明 (3) ウインドウリスナインタフェースの仕様 void windowactivated(windowevent e) ウインドウがアクティブ化されると呼び出される void windowclosed(windowevent e) dispose() により開放されたウインドウを消去すると呼び出される void windowclosing(windowevent e) ユーザがウインドウを閉じようとする時に呼び出される void windowdeactivated(windowevent e) ウインドウが非アクティブ化されると呼び出される void windowdeiconefied(windowevent e) ウインドウが非アイコン化されると呼び出される void windowiconified(windowevent e) ウインドウがアイコン化されると呼び出される void windowopened(windowevent e) ウインドウがオープンすると呼び出される
課題 フレームに部品を配置するプログラムを作成しなさい BorderLayout によりボタン 1, テキストエリア, ボタン 2 が配置 ボタン 1 をクリックするとテキストエリアに文字を埋める ボタン 2 をクリックするとテキストエリアをクリアする
import java.awt.*; import java.awt.event.*; class MyFrame extends Frame implements ActionListener { TextArea txtar1; Button btn1, btn2; public MyFrame(String title) { super(title); // タイトル設定 // 文字列表示のボタンを BorderLayout の北に配置 // テキストエリアを BorderLayout の中央に配置 // txtar1 = new TextArea(); // 文字列クリアのボタンを BorderLayout の南に配置 // 閉じるボタン対応 public void actionperformed (ActionEvent e) { // ボタン押下対応 if (e.getsource() == btn1) { txtar1.settext("aaaaaaaaaa nbbbbbbbbbb ncccccccccc n"); else if (e.getsource() == btn2) { txtar1.settext(""); public class JaFramKadai { public static void main(string args[]) { MyFrame frm = new MyFrame(" フレームテスト "); frm.setsize(300, 200); // 窓サイズを横 300, 縦 200 にする frm.setvisible(true) ; // フレームを表示する