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

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

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

<<前  [TOP]  次>>


複数の項目から値を選択するような場合には、「チェックボックス」や「ラジオボタン」の他に、リスト(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)リスト項目が削除された場合に呼び出される


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


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までのリストが表示されます。








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


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までのリストが表示されます。
フレームの右側にスクロールバーが表示されます。








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


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」ボタンを押すと、コマンドプロンプト上にアイテム名が表示されます。








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


SwingJListTest4.java 直

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」と表示されます。








<<前  [TOP]  次>>