第 5 章 総合演習 47
9.2 グラフィクス
9.2.2 色の指定
さて,前項で紹介した描画メソッドを用いると,一通りの形を描くことができるが,こ のままでは色彩は黒のままで描かれてしまう。そこで,色の指定方法につい説明しておく。
Java
では,描画メソッドの引数に色彩の指定がないことからも分かるように,描画メ ソッド単位ではなく,描画メソッドを使用する前にあらかじめ色の指定を行なう1。色の指 定そのものは,Color
というクラスによって行なう。Color
クラスでは,光の三原色RGB
の値を個別に指定して制御するようになっている。具体的には,Color
クラスの変数を定 義し,この変数に対して,好みの色を設定しておく。具体的には,次のようにする。Color c ;
c = new Color(255,0,0) ; // (R=255,G=0,B=0)なので赤色 次のように書いてもよい。
Color c = new Color(255,0,0) ; // (R=255,G=0,B=0)なので赤色
ポイントは,
new Color(
赤の強さ,緑の強さ,青の強さ)
の部分である。光の強さを,三原色それぞれに
0
〜255
の数値(
つまりそれぞれ8
ビットの範囲)
で指定する。続いて,描画メソッドを使用する前に,
setColor
メソッドを用いて,色の指定を行な う。上記の例のように,変数—c—
に赤色が設定されていれば,g.setColor( c ) ;
g.fillOval(10,10,100,100) ; // 赤い円
とすることで,赤の塗りつぶした円が描かれるという具合である。なお,基本的な色に関 しては,
Color
クラスに定義済みのものを使用することもできる(表9.1
)。1不便なようにも思えるが,Javaに限らず,グラフィクスの世界では,色と形状を別々に指定する方式は 一般的である
表
9.1:
定義済みの色(クラスColor
)色定数 色
Color.black 黒
Color.blue 青
Color.cyan シアン(青緑色)
Color.darkGray 濃い灰色
Color.gray 灰色
Color.green 緑
Color.lightGray 淡い灰色 Color.magenta マゼンタ(赤紫色)
Color.orange オレンジ
Color.pink ピンク
Color.red 赤
Color.white 白
Color.yellow 黄
93
第 10 章 GUI
10.1 GUI 部品
TextField
テキストフィールドは,文字列データの入出力に用います。実数・小数のような区別は ないので,あらかじめ文字列の状態に変換したり,文字列として取り出したデータを必要 な型のデータに変換して使用する必要があります。
●変数としての宣言
TextField tf1 ; // tf1 と名付けたテキストフィールド
●部品の割り当て(画面には表示されない)
tf1 = new TextField(5) ; // 5文字分の幅を持つテキストフィールド
●画面への配置
add(tf1) ; // 特定のオブジェクト上の場合は object.add(tf1)
変数はクラス内の共通変数(インスタンス変数)としておくのが通例で,割当と画面へ の配置は,通常
init()
内で行います。実際のデータのやりとりは,以下のように行うことになります。
●文字列データの取り出し String s ;
s = tf1.getText() ;
●整数データの取り出し int i ;
i = Integer.parseInt(tf1.getText()) ;
●実数データの取り出し float f ;
f = Float.valueOf(tf1.getText()).floatValue ;
●文字列データの表示 tf1.setText(s) ;
●整数データの表示
tf1.setText(Integer.toString(i)) ;
●実数データの表示
tf1.setText(Float.toString(f)) ;
●混在メッセージの表示
tf1.setText("あなたの肥満度は"+himando+"です") ;
混在メッセージでの例は,文字列との加算の場合は数値データの型に応じて
toString()
が行われた後に連結される,という性質を利用しています。この他,表示専用にするかしないかの設定を,
●表示専用にする
tf1.setEditable(flase) ;
●書き換え可能に戻す
tf1.setEditable(true) ;
として,入出力の目的に応じてコントロールできます。
TextArea
テキストエリアは,文字列データの(主に)出力に用いる。テキストフィールドと同様 に,実数・小数のような区別はないので,あらかじめ文字列に変換して使用するのはテキ ストフィールドと同様です。また,テキストフィールドと異なり,複数行利用できます。
●変数としての宣言
TextArea ta1 ; // ta1 と名付けたテキストエリア
●部品の割り当て(画面には表示されない)
ta1 = new TextArea(5,20) ; // 5行×20文字分の幅を持つテキストエリア
●画面への配置
add(ta1) ; // 特定のオブジェクト上の場合は object.add(ta1)
変数はクラス内の共通変数(インスタンス変数)としておくのが通例で,割当と画面へ の配置は,通常
init()
内で行います。実際のデータのやりとりは,以下のように行うことになります。
●文字列データの表示 ta1.append(s) ;
●整数データの表示
ta1.append(Integer.toString(i)) ;
●実数データの表示
ta1.append(Float.toString(f)) ;
●混在メッセージの表示
ta1.append("あなたの肥満度は"+himando+"です\n") ;
混在メッセージでの例は,文字列との加算の場合は,数値データの型に応じて
toString()
が行われた後連結される,という性質を利用しています。また,改行を示す\n
もC
言語 の場合と同様に機能します。Label
ラベルは,表示専用の文字列フィールドと考えればよいでしょう。一度設定すると,そ の内容をプログラム内で変更したり参照したりすることはほとんどないので,通常以下の ような使い方になります。
●部品の割り当てと画面への配置
add(new Label("体重")) ; // 表示のみなので通常はこのような使い方
10.1. GUI
部品95 Button
ボタンは,文字通り,クリック可能なボタンを構成します。ただし,クリックした際の 動作(イベント)を指示するための特別なメソッドを準備しておく必要があります。
●変数としての宣言
Button bt1 ; // bt1 と名付けたボタン
●部品の割り当て(画面には表示されない)
bt1 = new Button("Start") ; // Startというラベルを持つボタン
●画面への配置
add(bt1) ; // 特定のオブジェクト上の場合は object.add(bt1)
●リスナ(クリックしたこと−イベント−を検知して処理するメソッド)の登録
bt1.addActionListener(this) ;
変数はクラス内の共通変数としておくのが通例で,割当と画面への配置およびリスナの 登録は,通常
init()
内で行います。ボタンなど,ユーザからのアクションを処理する部品を使用する場合は,イベント処理 を行う都合でプログラムの先頭に
import java.awt.event.*;
を指示しておきます。さ らに,class
宣言時にimplements
キーワードを用いて,ActionListener
を指示してお く必要があります。他のクラスがすでにimplements
で指示されている場合は,カンマで 区切って続けます。●classでの宣言
public class myApplet extends Applet implements ActionListener { ...
} あるいは
public class myApplet extends Applet
implements Runnable, ActionListener { ...
} など
リスナは,
actionPerformed
メソッドを定義してそこに記述することになります。public class myApplet extends Applet implements ActionListener { ...
public void actionPerformed(ActionEvent ev) {
if( ev.getSource() == bt1 ) { // 特定のボタンが押されたか?
... 対応する動作の記述 ...
} } ...
}
Choice
チョイスは,与えられた選択肢から,ひとつの値を指示するのに用います。
●変数としての宣言
Choice ch1 ; // ch1 と名付けたチョイス
●部品の割り当て(画面には表示されない)
ch1 = new Choice() ; // 新しいチョイスを作成
●選択肢の追加
ch1.addItem("List 1") ; // 選択肢ごとに追加
ch1.addItem("List 2") ; // 新しいバージョンでは add() を使用
●画面への配置
add(ch1) ; // 特定のオブジェクト上の場合は object.add(ch1)
●リスナ(選択肢が変更されたこと−イベント−を検知して処理するメソッド)の登録
ch1.addItemListener(this) ;
変数はクラス内の共通変数としておくのが通例で,割当と画面への配置およびリスナの 登録は,通常
init()
内で行います。実際のデータのやりとりは,以下のように行うことになります。
●プログラム側からの指示で項目番号(先頭は0)を指定 ch1.select(1) ; // 2番目の項目に設定
●選択されている項目番号(先頭は0)を求める int idx ;
idx = ch1.getSelectedIndex() ;
●選択されている項目を文字列のまま取り出す String selectedItem ;
selectedItem = ch1.getSelectedItem() ;
リスナを用いた処理を行う場合は,
class
宣言時にimplements
キーワードを用いて,ItemListener
を指示しておく必要があります。他のクラスがすでにimplements
で指示 されている場合は,カンマで区切って続けます。●classでの宣言
public class myApplet extends Applet implements ItemListener { ...
} あるいは
public class myApplet extends Applet implements Runnable, ItemListener { ...
} など
リスナは,
itemStateChanged
メソッドを定義してそこに記述することになります。public class myApplet extends Applet implements ItemListener { ...
public void itemStateChanged(ItemEvent ev) {
if( ev.getSource() == ch1 ) { // 特定のチョイスが変更されたか?
... 対応する動作の記述 ...
} } ...
}
10.1. GUI
部品97 Checkbox
チェックボックスは,項目の選択/非選択の状態を取り出すために用いられます。
●変数としての宣言
Checkbox cb1 ; // cb1 と名付けたチェックボックス
●部品の割り当て(画面には表示されない)
cb1 = new Checkbox("I am a Japanese.") ; // 新しいチェックボックスを作成
●画面への配置
add(cb1) ; // 特定のオブジェクト上の場合は object.add(cb1)
●リスナ(選択状態が変更されたこと−イベント−を検知して処理するメソッド)の登録
cb1.addItemListener(this) ;
実際のデータのやりとりは,以下のように行うことになります。
●プログラム側からの指示で選択状態を指定
cb1.setState(true) ; // 選択された状態に設定 cb1.setState(false) ; // 非選択の状態に設定
●選択状態の判定
if( cb1.getState() ) { ...選択されている時...
} else {
...選択されていない時...
}
リスナを用いた処理を行う場合は,
class
宣言時にimplements
キーワードを用いて,ItemListener
を指示しておく必要があります。他のクラスがすでにimplements
で指示 されている場合は,カンマで区切って続けます。●classでの宣言
public class myApplet extends Applet implements ItemListener { ...
} あるいは
public class myApplet extends Applet implements Runnable, ItemListener { ...
} など
リスナは,
itemStateChanged
メソッドを定義してそこに記述することになります。public class myApplet extends Applet implements ItemListener { ...
public void itemStateChanged(ItemEvent ev) {
if( ev.getSource() == cb1 ) { // 特定のチェックボックスが変更されたか?
... 対応する動作の記述 ...
} } ...
}
Scrollbar
スクロールバーは,数値をスライダー形式で設定するのに用いられます。
●変数としての宣言
Scrollbar sc1 ; // sc1 と名付けたスクロールバー
●部品の割り当て(画面には表示されない)
// 最小値 0, 最大値 100 (=110-10), で幅10の水平スクロールバーを生成し初期値を50 に設定
// 垂直バーの場合は Scrollbar.VERTIAL を指定
sc1 = new Scrollbar(Scrollbar.HORIZONTAL, 50, 10, 0, 110) ;
●画面への配置
add(sc1) ; // 特定のオブジェクト上の場合は object.add(sc1)
●リスナ(選択状態が変更されたこと−イベント−を検知して処理するメソッド)の登録
sc1.addAdjustmentListener(this) ;
実際のデータのやりとりは,以下のように行うことになります。
●プログラム側からの指示で値を指示 sc1.setValue(75) ; // 75に設定
●値の取り出し int v ;
v = sc1.getValue() ;
リスナを用いた処理を行う場合は,
class
宣言時にimplements
キーワードを用いて,AdjustmentListener
を指示しておく必要があります。他のクラスがすでにimplements
で指示されている場合は,カンマで区切って続けます。●classでの宣言
public class myApplet extends Applet implements AdjustmentListener { ...
} あるいは
public class myApplet extends Applet
implements Runnable, AdjustmentListener { ...
} など
リスナは,
adjustmentValueChanged
メソッドを定義してそこに記述することになり ます。public class myApplet extends Applet implements AdjustmentListener { ...
public void adjustmentValueChanged(AdjustmentEvent ev) {
if( ev.getSource() == sc1 ) { // 特定のスクロールバーが変更されたか?
... 対応する動作の記述 ...
} } ...
}