S-JIS[2009-03-30/2011-04-15] 変更履歴

JComboBox(Swing)

JComboBoxは、コンボボックスのコンポーネント。
普段は1つの文字列を表示しているエリアだが、クリックすると一覧表(ドロップダウンリスト(Swingではポップアップと呼ぶらしい))が開かれ、その中の選択肢から値を選択することが出来る。


基本形

import javax.swing.JComboBox;
	/**
	 * コンボボックスの初期化
	 */
	private void initPane(Container c) {
		JComboBox combo = new JComboBox();
		combo.setEditable(true);

		JPanel panel = new JPanel();
		panel.add(combo);

		c.add(panel);
	}

※JComboBoxをコンテナに直接追加すると、画面いっぱいに広がったコンボボックスになってしまうので…、JPanelを間に入れている。

メソッド 説明 更新日
setEditable(true) デフォルトでは、コンボボックスのテキストエリアは編集(入力)できない。
このメソッドでtrueを指定すると、編集できるようになる。
2009-03-30
getSelectedItem() コンボボックスのテキストエリアに入っている文字列を取得する。 2009-03-30
getSelectedIndex() コンボボックスの選択肢一覧の中で選択されている値のインデックスを返す。
テキストエリアに直接入力していて選択肢に無い場合は-1を返す。
2009-03-30
getItemCount() コンボボックスの選択肢一覧の選択肢の個数を取得する。 2009-03-30
getItemAt(n) コンボボックスの選択肢一覧の中から値を取得する。 2009-03-30
removeItemAt(n) コンボボックスの選択肢を削除する。 2009-03-30
removeAllItems() コンボボックスの選択肢を全て削除する。 2011-04-15
addItem(文字列) コンボボックスの選択肢を追加する。 2009-03-30
setSelectedItem(値)
setSelectedIndex(n)
コンボボックスの初期値を設定する。 2011-04-15
isPopupVisible() 選択肢一覧(ドロップダウンリスト)が表示されているかどうかを調べる。 2009-03-30

JComboBoxも(JTableJTreeと同じく)モデルを内部に持っているが、JComboBoxでは特にモデルを使わなくても大抵の操作は実行できるようだ。


ボタンを押した時に選択肢を追加する例

コンボボックスとは別のボタンを用意し、そのボタンを押した時にコンボボックスの選択肢一覧に値を追加する例。

import javax.swing.JComboBox;
	private JComboBox combo;

	private void initPane(Container c) {
		combo = new JComboBox(); //コンボボックス
		combo.setEditable(true);

		JButton button = new JButton(new AddAction()); //追加ボタン

		JPanel panel = new JPanel();
		panel.add(combo);
		panel.add(button);

		c.add(panel);
	}
	//当クラスは、フィールドcomboが定義されているクラス内の内部クラスとする。
	//これにより、フィールドcomboへアクセスできるようになる。
	class AddAction extends AbstractAction {
		private static final long serialVersionUID = 1L;

		public AddAction() {
			super("追加ボタン");
		}

		// 選択肢の一覧に無い場合、一覧の末尾に追加
		@Override
		public void actionPerformed(ActionEvent e) {
			if (combo.getSelectedIndex() < 0) {
				Object item = combo.getSelectedItem();	//テキストエリアに入力されている文字列を取得し
				combo.addItem(item);			//文字列を一覧に追加する
			}
		}
	}

選択肢一覧から選択肢を削除する例

選択肢一覧(ドロップダウンリスト/ポップアップ)内の選択肢を表示している時にDeleteキーを押したらその選択肢を削除する例。

		JComboBox combo = new JComboBox();
		combo.registerKeyboardAction(	//Deleteキーを割り当て
			new DelAction(),
			KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),
			JComponent.WHEN_IN_FOCUSED_WINDOW);
class DelAction extends AbstractAction {
	private static final long serialVersionUID = 1L;

	@Override
	public void actionPerformed(ActionEvent e) {
		JComboBox combo = (JComboBox) e.getSource();
		if (combo.isPopupVisible()) {		//ドロップダウンリストが表示されているとき
			int s = combo.getSelectedIndex();	//選択されているインデックスを取得し
			if (s >= 0) {
				combo.removeItemAt(s);	//そのインデックスを削除
			}
		}
	}
}

ただし、テキストエリアが編集可能になっている場合は、Deleteキーはそのテキストエリア(JTextField)の文字削除として使われてしまうので、イベントを取得することが出来ない。
Ctrl+D等、他のキー割り当てに変えてやるのが楽。

		JComboBox combo = new JComboBox();
		combo.setEditable(true);
		combo.registerKeyboardAction(	//Ctrl+Dキーを割り当て
			new DelAction(),
			KeyStroke.getKeyStroke(KeyEvent.VK_D, KeyEvent.CTRL_DOWN_MASK),
			JComponent.WHEN_IN_FOCUSED_WINDOW);

ドロップダウンリストの取得

選択肢一覧のドロップダウンリスト部分(ポップアップ)はJListで作られている。
使う機会があるかどうかは分からないが、以下のようにすればJListを取得できる。

import javax.swing.JList;

import javax.accessibility.AccessibleContext;

//import javax.swing.plaf.ComboBoxUI;
import javax.swing.plaf.basic.BasicComboPopup;
//		ComboBoxUI ui = combo.getUI(); //実体はBasicComboBoxUI
//		BasicComboPopup popup = (BasicComboPopup) ui.getAccessibleChild(combo, 0);

		AccessibleContext ac = combo.getAccessibleContext(); //実体はAccessibleJComboBox
		BasicComboPopup popup = (BasicComboPopup) ac.getAccessibleChild(0);

		JList list = popup.getList();

		int s = list.getSelectedIndex();

※ComboBoxUI#getAccessibleChild()はJDK1.3より前の古いメソッドらしいが、AccessibleContext#getAccessibleChild()も内部ではそちらを呼んでいる


Swing目次へ戻る / Java目次へ戻る
メールの送信先:ひしだま