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

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Java | 48 | JList

↓↓クリックして頂けると励みになります。



47 | JTable】 << 【ホーム】 >> 【49 | JComboBox

JListを利用したプログラム
JListを利用したプログラム





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






↓↓クリックして頂けると励みになります。

YAE C5 CLINIC(札幌美容クリニック)

関連記事(外部サイト)