↓↓クリックして頂けると励みになります。
【48 | JList】 << 【ホーム】 >> 【50 | JTimerとJProgressBar】
リストと似た機能を持つものに「コンボボックス(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() | 全て削除 |
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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); } }
作成したプログラムを実行して動作を確認します。
コンボボックスが表示されます。
編集は出来ません。
~/Desktop/Programming/JP $ javac SwingJComboBoxTest1.java ~/Desktop/Programming/JP $ java SwingJComboBoxTest1
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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); } }
作成したプログラムを実行して動作を確認します。
コンボボックスが表示されます。
項目の編集が出来ます。
~/Desktop/Programming/JP $ javac SwingJComboBoxTest2.java ~/Desktop/Programming/JP $ java SwingJComboBoxTest2
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【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); } }
作成したプログラムを実行して動作を確認します。
コンボボックスが表示されます。
項目の編集が出来ます。
項目の追加・削除が出来ます。
コマンドプロンプト上にも結果が表示されます。
~/Desktop/Programming/JP $ javac SwingJComboBoxTest3.java ~/Desktop/Programming/JP $ java SwingJComboBoxTest3
【48 | JList】 << 【ホーム】 >> 【50 | JTimerとJProgressBar】
↓↓クリックして頂けると励みになります。