学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その48 JComboBoxを利用したプログラム

<<前  [TOP]  次>>


リストと似た機能を持つものに「コンボボックス(JComboBox)」があります。
コンボボックスは編集可能なアイテム(初期設定ではテキストフィールド)を持つドロップダウンリストです。
リストと違い、複数の項目からの選択は出来ません。
コンボボックスはjavax.swing.JComboBoxを用います。
JComboBoxは項目の追加や削除が可能です。

java.lang.Object
    +--java.awt.Component
        +--java.awt.Container
            +--javax.swing.JComponent
                +--javax.swing.JComboBox



コンボボックスはjavax.swing.ComboBoxModelインターフェイスを実装するクラスのモデルを利用します。
ComboBoxModelのスーパーインターフェースはListModelです。
今回はこのインターフェイスを実装したjavax.swing.DefaultListModelを利用します。
リスト同様、javax.swing.AbstractListModelをスーパーインターフェースとしています。


コンボボックスのリスト項目描画の変更は、自作する場合javax.swing.ListCellRendererインターフェースを実装したクラスを作成します。
初期設定では、javax.swing.plaf.basic.BasicComboBoxRendererが利用されます。


単純なコンボボックスの生成もリストと同様に作成できます。
生成例のひとつとして文字列をコンボボックスのリスト項目として、JComboBoxを生成しています。
正確には「Object[]」を指定しています。
この他にモデルなどでも生成できます。

String[] items = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
JComboBox<String> combo = new JComboBox<String>(items);    //itemsを基に生成



文字列「1」〜「10」という内容の項目を持つコンボボックスを生成します。
このときそれぞれの内容のインデックスは「0」から始まります。
つまり、インデックスは「0」〜「9」となります。


コンボボックスの項目を編集可能にするには、setEditable(true)とすれば良いですが、実行してみると、デフォルトのエディタでは、編集の結果がリストに反映されないことに気付くはずです。
例えば「item1」という項目を選択して、「test」と修正しても、再度リスト表示させると、「item1」と元に戻ります。


このようにならないようにエディタをカスタマイズしたければ、javax.swing.ComboBoxEditorインターフェースを実装したクラスを作成してください。
初期設定のテキストエディタはjavax.swing.plaf.BasicComboBoxEditorです。
実装するインターフェースはjavax.swing.ComboBoxEditorです。


選択されたリスト項目の取得は、「インデックス」あるいは「内容」のいずれでも使えます。


getSelectedIndex()メソッドでインデックスを取得、getSelectedItem()メソッドで内容を取得します。
comboはJComboBoxで生成されたインスタンスとします。

//選択されている項目のインデックスを取得
int[] listNo = list.getSelectedIndex();

 //選択されている項目の内容を取得
Object[] listElement = list.getSelectedItem();

 //取得した内容を画面へ出力
System.out.println("[" + listNo + "] = " + obj);



コンボボックスのイベントの1つは選択によるイベントです。
選択のイベントには「選択した」と「選択解除」の2種類があります。
イベントはjavax.awt.ItemListenerに通知され、処理はitemStateChanged(itemEvent)に記述します。
選択/解除はイベントのgetStateChange()メソッドで判定できます。
「itemEvent.SELECTED」で選択、「ItemEvent.DESELECTED」で選択解除を表します。

import javax.awt.event.*;

 public class JComboBoxTest implements ItemListener {

    private JComboBox<String> combo;
        :
     combo.addItemListener(this);    //コンボボックスのイベント通知登録
         :
     /**リストが選択/解除されたときの処理*/
    public void itemStateChanged(ItemEvent evt) {
        if (evt.getStateChange() == ItemEvent.SELECTED) {    //選択
             :
         }
        else {    //解除
             :
         }
    }
        :



コンボボックスでは編集によってもイベントが発生します。
エンターキーが押された場合にjava.awt.ActionListenerに通知されます。
処理はactionPerfprmed(ActionEvent)に記述します。


このとき、項目内容の見た目が変化するので、ItemEventも発生します。

import java.awt.event.*;

public class JComboBoxTest implements ActionListener {

    private JComboBox<String> combo;
        :
     combo.addActionListener(this); ・・コンボボックスのイベント通知登録
         :
     /**コンボボックスで編集された時の処理 */
    public void actionPerformed(ActionEvent evt) {
        :
     }
        :



追加は以下のメソッドを利用できます。

addItem(Object)指定オブジェクトをリストの最後に
insertItemAt(Object, int)指定オブジェクトを指定位置へ


削除は以下のメソッドを利用できます。
removeItem(Object)指定されたオブジェクトを削除
removeItemAt(int)指定されたインデックス位置のリストを削除
編集中だと削除できません
removeAllItems()全て削除


以下のサンプルプログラムを作成してみましょう。


SwingJComboBoxTest1.java 直

/** JComboBox のテスト*/

import javax.swing.*;

public class SwingJComboBoxTest1 {
	private String[] items = { "item1", "item2", "item3", "item4", "item5","item6", "item7", "item8", "item9", "item10" };
	private JComboBox<String> combo;

	/** コンストラクタ*/
	public SwingJComboBoxTest1() {
		combo = new JComboBox<String>(items);	//itemsを元にJComboBoxを生成
	}

	/** main()*/
	public static void main(String[] args) {

                SwingJComboBoxTest1 sample = new SwingJComboBoxTest1();

                JFrame frame = new JFrame("JComboBoxTest1");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(sample.combo, "Center");
                frame.pack();
                frame.setVisible(true);
        }
}



サンプルを実行してみましょう。
コンボボックスが表示されます。
編集は出来ません。








以下のサンプルプログラムを作成してみましょう。


SwingJComboBoxTest2.java 直

/** JComboBox のテスト*/

import javax.swing.*;

public class SwingJComboBoxTest2 {

	private String[] items = { "item1", "item2", "item3", "item4", "item5","item6", "item7", "item8", "item9", "item10" };

	private JComboBox<String> combo;

	/** コンストラクタ*/
	public SwingJComboBoxTest2() {
		combo = new JComboBox<String>(items);	//itemsを元にJComboBoxを生成
		combo.setEditable(true);
	}

	/** main()*/
	public static void main(String[] args) {

                SwingJComboBoxTest2 sample = new SwingJComboBoxTest2();

                JFrame frame = new JFrame("JComboBoxTest2");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(sample.combo, "Center");
                frame.pack();
                frame.setVisible(true);
        }
}



サンプルプログラムを実行してみましょう。
コンボボックスが表示されます。
項目の編集が出来ます。


以下のサンプルプログラムを作成してみましょう。


SwingJComboBoxTest3.java 直

/** JComboBox のイベント*/

import javax.swing.*;
import java.awt.event.*;
import java.util.Date;
import java.text.SimpleDateFormat;

public class SwingJComboBoxTest3  implements ItemListener, ActionListener {

	private String[] items = { "item1", "item2", "item3", "item4", "item5","item6", "item7", "item8", "item9", "item10" };
	private JComboBox<String> combo;
	private JButton removeButton, addButton;
	private JPanel panel;

	/** コンストラクタ*/
	public SwingJComboBoxTest3() {
		combo = new JComboBox<String>(items);	//itemsを元にJComboBoxを生成
		combo.setEditable(true);

		//ボタンが押されたら選択されている項目を削除
		removeButton = new JButton("Remove");

		//ボタンが押されたら最後に項目を追加
		addButton = new JButton("Add");

		//パネルにボタンを配置
		panel = new JPanel();
		panel.add(removeButton);
		panel.add(addButton);

		//ボタンのイベント通知登録
		removeButton.addActionListener(this);
		addButton.addActionListener(this);

		//コンボボックスのイベント通知登録
		combo.addItemListener(this);
		combo.addActionListener(this);
	}


	/**ボタンが押された/コンボボックスで編集された時の処理*/
	public void actionPerformed(ActionEvent evt) {
		String command = evt.getActionCommand();

		int itemNo = combo.getSelectedIndex();

		if(command.equals("Remove") && itemNo != -1) {	//選択オブジェクトがあれば削除

			combo.removeItemAt(itemNo);
		}
		else if(command.equals("Add")) {	//項目の最後に追加

			// 日付の出力形式を設定
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

			Date date = new Date();		//追加項目として使用
			String sdate = sdf.format(date);	//Date型をString型に変換
			combo.addItem(sdate);
		}
		else {		//編集した内容を標準出力(画面)へ
			System.out.println("Edit ->" + combo.getSelectedItem());
		}
	}

	/** リストが選択/削除された時の処理*/
	public void itemStateChanged(ItemEvent evt) {

		//イベントで呼び出されたアイテムを取得
		String item = evt.getItem().toString();

		//選択状態の表示
		String str;


		//取得した内容を標準出力(画面)へ
		if(evt.getStateChange() == ItemEvent.SELECTED) {
			str = "Selected (" + item + ") -> " + "[" + combo.getSelectedIndex() 
							+ "] = " + combo.getSelectedItem();
		}
		else {
			str = "Deselected (" + item + ")";
		}
		System.out.println(str);
	}

	/** main()*/
	public static void main(String[] args) {

                SwingJComboBoxTest3 sample = new SwingJComboBoxTest3();

                JFrame frame = new JFrame("JComboBoxTest3");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(sample.combo, "Center");
		frame.getContentPane().add(sample.panel, "North");
                frame.pack();
                frame.setVisible(true);
        }
}



では、サンプルプログラムを実行してみましょう。
コンボボックスが表示されます。
項目の編集が出来ます。
項目の追加・削除が出来ます。
コマンドプロンプト上にも結果が表示されます。








<<前  [TOP]  次>>