2.6 コンボボックス(JComboBox)の使い方
本節では、コンボボックス(JComboBox)の使い方を見ていきます。
コンボボックスとはボタンとリストを組み合わせた選択画面であり、ドロップダウンリストやプルダウンメニュー等とも呼ばれます。言葉で説明するより、見たほうが早いでしょう。「あぁこれね。」となるはずです。
1.コンボボックスの設置
それではコンボボックスの設置からはじめましょう。本節からは新しいプロジェクトを利用していきます。「ComboBoxExample」という名前の新規プロジェクトを作成しましょう。
プロジェクトを作成したら、「SimpleFrame」という名前のJFrameフォームを作成します。よくわからない場合は、2.1 ソフトウェアの画面作り(JFrame)とルック・アンド・フィールを参照して下さい。
「パレット」ウィンドウの「Swingコントロール」タブから「コンボボックス」をクリックし、「JFrame」フォームの上でもう一度クリックして配置します。
コンボボックスを右クリックして、[変数名を変更]を選択します。
「comboChangeColor」という名前をつけました。色を変更する(ChangeColor)機能を持ったコンボボックス(combo)という意味です。省略して「cmbColor」等でも構いません。
コンボボックスを右クリックして、[プロパティ]を選択します。プロパティウィンドウの[model]と書かれた項目の右側の[…]をクリックします。
ここで、コンボボックスのモデル(リストの項目)を決定することができます。今回は上図のように入力して、[OK]ボタンを押しましょう。
必要に応じて、外観を変更します。見やすいようにフォントやサイズを変更して上図のようにしました。
実行してみましょう。コンボボックスをクリックすると、リストが表示され、項目を選択することができます。どこかできっと見たことがあるはずです。
2.機能の実装
次は機能の実装を行っていきます。機能を確認するために、まずはラベルを用意しましょう。
上のように、JLabelを画面の好きな場所に設置します。名前は「lblColor」としました。コンボボックスをダブルクリックするか、コンボボックスを右クリックして[イベント]->[Action]->[ActionPerformed]と進み、ソース編集画面に移ります。
「comboChangeColorActionPerformed()」と書かれたメソッドに移動すると思います(ソース画面に写ってもここに移動しない場合は、スクロールしてこのメソッドを探して下さい)。このメソッドは、コンボボックスの選択項目が変更されたときに呼び出されます。そこに、次のソースコードを挿入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//コンボボックスの選択位置を取得(0,1,2...) int index = comboChangeColor.getSelectedIndex(); //コンボボックスに応じてラベルテキストを変更 switch (index) { case 0: lblColor.setText("何も選択されてないよ"); break; case 1: lblColor.setText("赤色が選択されたよ"); break; case 2: lblColor.setText("青色が選択されたよ"); break; case 3: lblColor.setText("緑色が選択されたよ"); break; case 4: lblColor.setText("黄色が選択されたよ"); break; case 5: lblColor.setText("水色が選択されたよ"); break; default: lblColor.setText("こんな項目無いよ"); } } |
このソースコードは、コンボボックスの選択位置に応じて、「lblColor」ラベルのテキストを変更するものとなっています。以下、ソースコードの説明を簡単にしていきます。まず、コンボボックスのどの項目が選択されているかを取得する際は、「getSelectedIndex()」メソッドを利用します。上から数えて何番目の項目が選択されているかを整数値で取得できるメソッドで、一番上から順に0,1,2..と数えていきます。
1 |
int index = comboChangeColor.getSelectedIndex(); |
この行では、整数型の変数「index」に、現在選択されているコンボボックスの位置を代入しています。
その後はswitch文を利用した分岐を行っています。switch文はif文と似ていますが、分岐が多い際に利用すると便利です。switch文は次のように利用されます。
1 2 3 4 5 6 7 8 9 10 |
switch (num) { case 0: //numが0のとき、ここが実行される(breakで分岐から離脱) break; case 1: //numが1のとき、ここが実行される break; default: //いずれにも該当しない場合、ここが実行される } |
前述したソースコードは、次のようにif文で書き換えることも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (index == 0) { lblColor.setForeground(Color.black); } else if (index == 1) { lblColor.setText("赤色が選択されたよ"); } else if (index == 2) { lblColor.setText("青色が選択されたよ"); } else if (index == 3) { lblColor.setText("緑色が選択されたよ"); } else if (index == 4) { lblColor.setText("黄色が選択されたよ"); } else if (index == 5) { lblColor.setText("水色が選択されたよ"); } else { lblColor.setText("こんな項目無いよ"); } |
実際に実行してみましょう。
コンボボックスの選択位置を変えると、ラベルに表示されるテキストも変わります。テキストの変更だけでは寂しいので、実際に色も変更してみましょう。
ラベルの文字色を変更するには、「setForeground()」メソッド及び「Color」クラスを利用して、次のように書きます。
1 |
[ラベル名].setForeground(Color.black); |
Colorクラスには標準で幾つか色が用意されており、「Color.」と打ち込むことで、用意されている色を見ることができます(何も出てこない場合は、「Color.」と打った後に[Ctrl]+[スペース]を押します)。このように入力候補から打ち込んだ場合は何も問題は発生しませんが、単に文字を打ち込んだりコピーして貼り付けた場合は「Color」の部分に赤い下線が引かれ、「シンボルを見つけられません」というエラーが出ることがあります。これは、色に関する情報が詰まったColorクラスが読み込まれて(importされて)いないことが原因です。入力候補から打ち直すか、ソース編集画面上で右クリックして[インポートを修正]を選択することでこの問題は解消されます。ソース画面の上の方を見ると、次の行が追加されているはずです。
1 |
import java.awt.Color; |
これは、(javaパッケージ内のawtパッケージ内の)Colorクラスをインポートせよ、という命令です。Colorクラスをインポートすることで、色に関する様々な命令が利用できます。この行は直接手書きしても問題ありません。
Colorクラスを利用して、先ほどのソースコードを次のように書きなおしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//コンボボックスの選択位置を取得(0,1,2...) int index = comboChangeColor.getSelectedIndex(); //コンボボックスに応じてラベルテキストを変更 switch (index) { case 0: lblColor.setForeground(Color.black); lblColor.setText("何も選択されてないよ"); break; case 1: lblColor.setForeground(Color.red); lblColor.setText("赤色が選択されたよ"); break; case 2: lblColor.setForeground(Color.blue); lblColor.setText("青色が選択されたよ"); break; case 3: lblColor.setForeground(Color.green); lblColor.setText("緑色が選択されたよ"); break; case 4: lblColor.setForeground(Color.yellow); lblColor.setText("黄色が選択されたよ"); break; case 5: lblColor.setForeground(Color.cyan); lblColor.setText("水色が選択されたよ"); break; default: lblColor.setText("こんな項目無いよ"); } |
実行してみましょう。
ラベルの文字色が変更されたら成功です。
(2013年11月14日 加納徹)