Java言語
第10回 ウインドウ型アプリケーション(1)
知的情報システム工学科
久保川 淳司
前回の課題
(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
クラス
を継承してクラスを作成する。
表示させる窓のサイズは以下のように設定する。
(注)アプレットでの窓のサイズは,HTMLで記述していた。
/* <APPLET CODE="JaPanelKadai.class"
WIDTH=200 HEIGHT=120
> </APPLET> */
class MyPrg extends
Frame
{
...
}
xxx.setSize(横サイズ, 縦サイズ);
ウインドウ型アプリケーションの基礎知識
(3)
窓への描画
窓への描画はこれまでのアプレットとほとんど同じ方法
(paintメソッド)で実現できる。
部品の配置
Frameでは
デフォルトで
BorderLayout
が用いられる
(AppletのデフォルトはFlowLayout)。
Appletの時と同様に,自由にレイアウトを変更することが
できる。また,
Panelも使用することができる。
public void
paint
(Graphics g) {
g.drawString(....);
g.drawOval(....);
....
ウインドウ型アプリケーションの基礎知識
(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); // フレームの場合ウインドウ型アプリケーションの作成
(2)
import java.awt.*;
import java.awt.event.*;
class MyFrame extends Frame { // Frameを継承して窓を作成する
public MyFrame(String title) {
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
(ウインドウ用)
フレームクラスの説明
(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をクリックするとテキストエリアに文字を埋める
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) ; // フレームを表示する
} }