[目次] [前回] [次回] [重要語索引]

第8週: GUI

8. 1 ユーザインターフェース
8. 2 基本的な部品
8. 3 練習問題
8. 4 部品の属性
8. 5 練習問題
8. 6 フォント
8. 7 練習問題
8. 8 レイアウト
8. 9 練習問題
8.10 パネル
8.11 テキストフィールド
8.12 練習問題
8.13 宿題
8.14 おまけ

8.1 ユーザインターフェース

コンピュータでプログラムが動いているとき、それが人間に対してどのように見えるかということをユーザインターフェース(user interface)と呼びます。例えば、ウィンドウを表示してマウスでクリックできるようにするのも一つのユーザインターフェースですし、結果を標準出力に出すだけでも一つのユーザインターフェースです。

キーボードから命令をタイプするのではなく、ウィンドウとマウスを使った直感的に分かりやすいユーザインターフェースのことをグラフィカルユーザインターフェース(graphical user interface)、略して GUI と呼びます。Java には、GUI を作るための機能が標準で備わっています。

GUI にはよく使われる部品があります。例えば、メニューやボタンやテキスト入力フィールドなどです。こういった部品を組み合わせることによって、あるプログラムの GUI を作ります。組み合わせて使えるようにできている部品セットのことをツールキット(toolkit)と呼びます。

Java には AWT と Swing という二つのツールキットが用意されています。Swing の方が高機能ですが、まだ新しいためブラウザが対応していなかったり、参考資料が少なかったりという難点があります。ここでは AWT を使った GUIの作り方を勉強します。

8.2 基本的な部品

メニューやボタンなどの部品は、それぞれがオブジェクトです。AWT というツールキットは、そういった部品のクラスをたくさん集めたものです。

前回使った SfcTemplate3.java ではどのような部品を使っているか見てみましょう。

 6
import java.awt.*;

14
15
16
17
18
19
20
21
22
    Label l1 = new Label("No Title");
    Canvas c1 = new Canvas() {
	public void paint(Graphics g) {

	    // ここで描画領域に図形を描く。(0.2秒間隔で呼び出される)

	}
    };
    Button b1 = new Button("Click");

8.3 練習問題

前回の MovingBall.java を変更し、画面上の「No title」の代わりに「Moving Ball」、画面下の「click」の代わりに「ここを押して!」と表示されるようにしなさい。
日本語文字列を含むプログラムをコンパイルする時は javac コマンドに -encoding JIS などのオプションが必要です。

8.4 部品の属性

それぞれの部品には、大きさや色や表示する文字列など、いろいろな属性があります。インスタンスを作ったときには、デフォールト(省略時設定)の属性になっていますが、部品のメソッドを呼び出すことによって変更することができます。

    部品のインスタンス.set属性(必要なデータ)

SfcTemplate3.java では、描画領域の大きさを横400、縦300に、背景色を白に設定しています。
26
27
28
    public void init() {
	c1.setSize(400, 300);
	c1.setBackground(Color.white);

8.5 練習問題

MovingBall.java の描画領域の色をシアン(Color.cyan)に、その上のラベルの色を黄色(Color.yellow)にしましょう。(大きさの変更については、後で述べるレイアウトのところで説明します)

8.6 フォント

ラベルやボタンに表示される文字列が小さくて見栄えがしないので、もっときれいに表示しましょう。

文字のデザインに関するデータをフォント(font)と呼びます。フォントデータは、それぞれのコンピュータに格納されているので、表示するコンピュータによって使用できるフォントの種類が違います。

Java では、次のフォント名を指定すると、そのコンピュータで使用できるフォントの中から適当なものを選んでくれます。

また、それぞれのフォント名に対して、次のようなスタイルを指定できます。 さらに、文字の大きさをポイント数(活字の大きさを指定する単位)で指定します。

例えば、SansSerif のボールド体の24ポイントのフォントを使いたければ、次のようにして Font クラスのインスタンスを作ります。

    new Font("SansSerif", Font.BOLD, 24)
出来たインスタンスは、とりあえず Font 型の変数に記憶しておきます。そのフォントを使いたいラベルやボタンに対して、setFontメソッドで Font のインスタンスを指定することができます。
    部品のインスタンス.setFont(フォントのインスタンス)

8.7 練習問題

MovingBall.java を変更し、ラベルとボタンの文字が SansSerif のボールド体の24ポイントのフォントで表示されるようにしなさい。

init メソッドの中でフォントを設定しましょう。

  1. Font のインスタンスを作り、Font 型の変数f に記憶させます。
  2. Label 型の変数 l1 が記憶しているインスタンスに対して、f が記憶しているフォントのインスタンスを設定します。
  3. Button 型の変数 b1 が記憶しているインスタンスに対して、f が記憶しているフォントのインスタンスを設定します。

8.8 レイアウト

部品をいくつか並べるときは、自動的に大きさや位置を調整して配置してくれる機能があります。SfcTemplate3.java では、BorederLayout というクラスのインスタンスを使用しています。
29
30
31
32
	setLayout(new BorderLayout());
	add(l1, BorderLayout.NORTH);
	add(c1, BorderLayout.CENTER);
	add(b1, BorderLayout.SOUTH);

BorderLayout 以外の配置の仕方は、こちらを見てください。

ウィンドウ全体の大きさは、SfcTemplate3.htmlapplet 要素の属性で指定しています。
 8
<applet code="SfcTemplate3.class" width=400 height=345>

それぞれの部品が属性として持っている大きさと、このウィンドウの大きさがうまく合わないときは、BorderLayout クラスのインスタンスが、部品の大きさを変更します。

8.9 練習問題

BorderLayout クラスによる大きさの調整方法を調べてみましょう。

  1. MovingBall.htmlappletviewer で表示し、そのウィンドウの大きさをマウスで変更してみなさい。キャンバスやボタンの大きさはどう変わりますか?
  2. MovingBall.java を書き換えて、ボタンが CENTERで、キャンバスが SOUTH に配置されるようにしなさい。
  3. もう一度 appletviewer で表示し、ウィンドウの大きさをマウスで変更してみなさい。今度はキャンバスやボタンの大きさはどう変わりますか?
  4. 大きさの変化が確認できたら、配置を元に戻しておきましょう。

8.10 パネル

BorderLayout では、5個所のそれぞれに1個ずつしか部品を配置できません。もっと複雑な配置をするためには、Panel クラスを使用します。

Panel クラスも部品の一種ですが、それ自体には機能がなく、他の部品を配置するための土台として使われます。

SfcTemplate1.javaPanel クラスをどのように使っているか見てみましょう。
11
    Panel p1 = new Panel(), p2 = new Panel();

20
21
22
23
	p1.add(l1);
	p1.add(t1);
	p2.add(l2);
	p2.add(t2);
24
25
26
27
	setLayout(new BorderLayout());
	add(p1, BorderLayout.NORTH);
	add(b1, BorderLayout.CENTER);
	add(p2, BorderLayout.SOUTH);

8.11 テキストフィールド

文字を入力するためには、TextField クラスを使います。

SfcTemplate1.javaTextField クラスをどのように使っているか見てみましょう。
13
    TextField t1 = new TextField(), t2 = new TextField();

17
18
19
	t1.setColumns(20);
	t2.setColumns(20);
	t2.setEditable(false);
35
36
37
38
39
40
41
    String sfcInput () {
	return t1.getText();
    }

    void sfcOutput (String s) {
	t2.setText(s);
    }

8.12 練習問題

大昔に作った ForeignExchange.java を、sfcInput,sfcOutput を使わず、直接 t1.getText(), t2.setText(s) を使うように書き換えなさい。

8.13 宿題

ForeignExchange.java を変更し、ラベルやボタンを見栄え良くしなさい。また、為替レートを入力できるようにしなさい。

実行例

8.14 おまけ

GridLayoutCheckboxの説明を読み、10個以上のチェックボックスを配置して、その中のいくつがチェックされたかを数えて表示するプログラムを書きなさい。


[目次] [前回] [次回] [重要語索引]

慶應義塾大学の授業以外での無断利用、複製はご遠慮下さい。
Copyright (c) 2000 慶應義塾大学