↓↓クリックして頂けると励みになります。
【47 | JTable】 << 【ホーム】 >> 【49 | JComboBox】
複数の項目から値を選択するような場合には「チェックボックス」や「ラジオボタン」の他に、リスト(JList)を使う方法があります。
リストはjavax.swing.JListを用います。
java.lang.Object +--java.awt.Component +--java.awt.Container +--javax.swing.JComponent +--javax.swing.JList
リストもツリーやテーブルのように具体的な構成は「モデル」をもとにします。
リストのモデルを自作する場合はjavax.swing.ListModelインターフェイスと、そのメソッドを実装したjavax.swing.DefaultListModelを利用すればよいです。
またリストは選択された項目もモデル化します。
プログラム作成上はそれほど意識する必要はありませんが、javax.swing.ListSelectionModelインターフェイスとそのメソッドを実装したjavax.swing.DefaultListSelectionModelがそれにあたります。
初期設定ではjavax.swing.DefaultListCellRendererを用いてリスト項目の表示を行っています。
表示できるのはオブジェクトで、アイコンまたは文字列です。
以下はリストの生成例のひとつで文字列をリストの項目としてJListを生成しています。
String[] items = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; JList<String> list = new JList<String>(items); // itemsを基にリストを生成
文字列「1」〜「2」という内容の項目を持つリストを生成します。
このときそれぞれの内容のインデックスは「0」から始まります。
つまりインデックスは「0」〜「9」となります。
先に生成されたリストは全ての項目を表示させますが、場合によっては全ての項目を適切に表示できない場合があります。
このようなことを避けるため通常リストはスクロールペインへ配置します。
Stirng[] items = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; JList<String> list = new JList<String>(items); //itemsを基にリストを生成 JScrollPane sp = new JScrollPane(list); //スクロールペインに配置
スクロールペインに配置した場合、初期設定では8項目が表示され、それ以上の項目がスクロールで現れるようになります。
表示項目を設定するにはsetVisibleRowCount()メソッドを使用します。
listはJListで生成されたインスタンスとします。
list.setVisibleRowCount(5); //5行表示(初期設定は8行)
選択されたリスト項目の取得は「インデックス」あるいは「内容」のいずれでも使えます。
JListのインスタンスからこれらの取得を行う場合はgetSelectedIndices()メソッドでインデックスを取得、getSelectedValuesList()メソッドで内容を取得します。
いずれも各返値の配列に昇順で項目が記憶されます。
listはJListで生成されたインスタンスとします。
//List型を使用するのでインポート import java.util.List; //選択されている項目のインデックスを取得(昇順) int[] listNo = list.getSelectedIndices(); //取得した内容を画面へ出力 for (int i=0; i<listNo.length; i++) { //選択されている項目の内容を取得(昇順) List<String> listElement = list.getSelectedValuesList(); System.out.println("[" + listNo[i] + "] = " + listElement); }
先に述べたように項目の最初は[0]から始まりますので注意してください。
JDK 1.7以前では、項目の内容の取得に「getSelectedValues()
」が利用可能でした。
JDK 1.7以降は非推奨になり、「getSelectedValuesList()
」 に置き換えられています。
「getSelectedValuesList()
」の戻り値はList型ですが、「getSelectedValues()
」の戻り値はObject[]型
なので以下のような書き方が出来ました。
//選択されている項目のインデックスを取得(昇順) int[] listNo = list.getSelectedIndices(); //選択されている項目の内容を取得(昇順) Object[] listElement = list.getSelectedValues(); //取得した内容を画面へ出力 for (int i=0; i<listNo.length; i+) { System.out.println("[" + listNo[i] + "] = " + listElement[i]); }
リスト内で選択範囲の変更があった場合の処理としてjavax.swing.eventにあるListSelectionListenerインターフェイスを紹介します。
対応するメソッドは、valueChanged(ListSelectionEvent e)
です。
ListSelectionEventでは以下のようなメソッドを使用できます。
int getFirstIndex() | 選択が変更された可能性のある最初の行を取得 |
int getLastIndex() | 選択が変更された可能性のある最後の行を取得 |
boolean getValueIsAdjusting() | 変更イベントが発生している場合にtrue |
String toString() | イベントのタイプを文字列表記 |
import javax.swing.event.*; public class JListTest implements ListSelectionListener { JList<String> list; : list.addListSelectionListener(this); //JListのイベント通知登録 : /**リストが変更された時の処理*/ public void valueChanged(ListSelectionEvent e) { String s; if(e.getValueIsAdjusting() ) { //選択中 System.out.println("選択中"); } else { //選択が変更された可能性のあるインデックスを取得 System.out.println(e.getFirstIndex() + "から" + e.getLastIndex()); } } :
この他にリストに関連付けられたデータに変更が生じた場合の通知にはjavax.swing.eventにあるListDataListenerインターフェイスとListDataEventを引数として持つ以下のメソッドを実装すればよいです。
contentsChanged(ListDataEvent) | リスト内容が複雑な方法で変更された場合に呼び出される。 |
intervalAdded(ListDataEvent) | リスト項目が挿入された場合に呼び出される |
intervalRemoved(ListDataEvent) | リスト項目が削除された場合に呼び出される |
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingJListTest1.java】
import javax.swing.*; public class SwingJListTest1 { private String[] items = { "item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10" }; private JList<String> list; /** コンストラクタ*/ public SwingJListTest1() { list = new JList<String>(items); //itemsを元にJListを生成 } /** main() */ public static void main(String[] args) { SwingJListTest1 sample = new SwingJListTest1(); JFrame frame = new JFrame("JListTest1"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(sample.list, "Center"); frame.pack(); frame.setVisible(true); } }
実行するとitem1からitem10までのリストが表示されます。
~/Desktop/Programming/JP $ javac SwingJListTest1.java ~/Desktop/Programming/JP $ java SwingJListTest1
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingJListTest2.java】
/** JListのテスト(スクロールペインに配置) */ import javax.swing.*; public class SwingJListTest2 { private String[] items = { "item1", "item2", "item3", "item4", "item5","item6", "item7", "item8", "item9", "item10" }; private JList<String> list; private JScrollPane sp; /** コンストラクタ*/ public SwingJListTest2() { list = new JList<String>(items); //itemsを元にJListを生成 list.setVisibleRowCount(5); //5行表示(初期設定は8行 sp = new JScrollPane(list); //スクロールペインに配置 } /** main() */ public static void main(String[] args) { SwingJListTest2 sample = new SwingJListTest2(); JFrame frame = new JFrame("JListTest2"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(sample.sp, "Center"); frame.pack(); frame.setVisible(true); } }
作成したプログラムを実行して動作を確認します。
item1からitem10までのリストが表示されます。
フレームの右側にスクロールバーが表示されます。
~/Desktop/Programming/JP $ javac SwingJListTest2.java ~/Desktop/Programming/JP $ java SwingJListTest2
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingJListTest3.java】
/** JListのテスト(値の取得) */ import java.awt.event.*; import javax.swing.*; import java.util.List; public class SwingJListTest3 implements ActionListener { private String[] items = { "item1", "item2", "item3", "item4", "item5","item6", "item7", "item8", "item9", "item10" }; private JList<String> list; private JScrollPane sp; private JButton button; private List<String> listElement; /** コンストラクタ*/ public SwingJListTest3() { list = new JList<String>(items); //itemsを元にJListを生成 list.setVisibleRowCount(5); //5行表示(初期設定は8行 sp = new JScrollPane(list); //スクロールペインに配置 //生成されたボタンが押されたら選択されている項目を表示 button = new JButton("Print"); //ボタンのイベント通知登録 button.addActionListener(this); } /** ボタンが押された時の処理 */ public void actionPerformed(ActionEvent evt) { //選択されている項目のインデックスを取得(昇順) int[] listNo = list.getSelectedIndices(); //取得した内容を画面へ出力 for (int i=0; i<listNo.length; i++) { //選択されている項目の内容を取得(昇順) listElement = list.getSelectedValuesList(); System.out.println("[" + listNo[i] + "] = " + listElement); } System.out.println(); } /** main() */ public static void main(String[] args) { SwingJListTest3 sample = new SwingJListTest3(); JFrame frame = new JFrame("JListTest3"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(sample.sp, "Center"); frame.getContentPane().add(sample.button, "South"); frame.pack(); frame.setVisible(true); } }
作成したプログラムを実行して動作を確認します。
itemを選択して「print」ボタンを押すと、ターミナルにアイテム名が表示されます。
~/Desktop/Programming/JP $ javac SwingJListTest3.java
~/Desktop/Programming/JP $ java SwingJListTest3
[0] = [item1]
Visual Studio Codeで以下のプログラムを作成します。
新規作成 【SwingJListTest4.java】
/** JListのテスト(値の取得) */ import java.awt.event.*; import javax.swing.*; import java.util.List; import javax.swing.event.*; public class SwingJListTest4 implements ListSelectionListener { private String[] items = { "item1", "item2", "item3", "item4", "item5","item6", "item7", "item8", "item9", "item10" }; private JList<String> list; private JScrollPane sp; private JLabel label; /** コンストラクタ*/ public SwingJListTest4() { list = new JList<String>(items); //itemsを元にJListを生成 list.setVisibleRowCount(5); //5行表示(初期設定は8行 sp = new JScrollPane(list); //スクロールペインに配置 //変化の内容を表示するラベルを生成 label = new JLabel("Message"); //ボタンのイベント通知登録 list.addListSelectionListener(this); } /** リスト内で選択範囲が変更された時の処理 */ public void valueChanged(ListSelectionEvent evt) { String str; if(evt.getValueIsAdjusting()) { //選択中 str = "Adjusting"; } else { //選択が変更された可能性のあるインデックスを取得 str = evt.getFirstIndex() + "-" + evt.getLastIndex(); } //文字列をラベルに設定 label.setText(str); } /** main() */ public static void main(String[] args) { SwingJListTest4 sample = new SwingJListTest4(); JFrame frame = new JFrame("JListTest4"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(sample.sp, "Center"); frame.getContentPane().add(sample.label, "South"); frame.pack(); frame.setVisible(true); } }
作成したプログラムを実行して動作を確認します。
リストを選択すると下にメッセージが表示されます。
例えばitem2を選択した後にitem6を選択すると「1-5」と表示されます。
~/Desktop/Programming/JP $ javac SwingJListTest4.java ~/Desktop/Programming/JP $ java SwingJListTest4
【47 | JTable】 << 【ホーム】 >> 【49 | JComboBox】
↓↓クリックして頂けると励みになります。