JListにアイコンとテキストを表示するサンプル

前回作成した「JListを表示するだけのサンプル」にアイコンを追加しました。

解説

JListにアイコンとテキストを表示するには、自作のListCellRendererが必要になります。
以下のようにDefaultListCellRendererを継承して、getListCellRendererComponentでアイコンとテキストを設定します。
/**
	 * JList用のセルセンダラー
	 */
	class FileListCellRenderer extends DefaultListCellRenderer {
		FileSystemView fs = FileSystemView.getFileSystemView();
 
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
			super.getListCellRendererComponent(list, value, index, isSelected,
					cellHasFocus);
 
			// valueがFileクラスの場合、テキストとアイコンを設定します。
			if (value instanceof File) {
				File f = (File) value;
				setText(fs.getSystemDisplayName(f));
				setIcon(fs.getSystemIcon(f));
			}
			return this;
		}
	}
 

作成したCellRendererは以下のように、JListに設定します。
// 自作のセルレンダラーを設定します
		list.setCellRenderer(new FileListCellRenderer());
 
 

ソース ダウンロード->JListSample2.java

import java.awt.Component;
import java.awt.ScrollPane;
import java.io.File;
 
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.filechooser.FileSystemView;
 
/*
 * JListにアイコンを追加
 * C:\のファイル一覧をJListで表示する
 */
public class JListSample2 extends JFrame {
 
	JList list;
	DefaultListModel model;
 
	public JListSample2(String title) {
		super(title);
 
		init();
 
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setBounds(100, 100, 300, 200);
		setVisible(true);
	}
 
	private void init() {
		// 表示データ作成
		File dir = new File("C:\\");
		File[] childs = dir.listFiles();
 
		// リストモデルを生成
		model = new DefaultListModel();
 
		// 表示データをリストモデルに設定
		for (File file : childs) {
			model.addElement(file);
		}
 
		// リストモデルを使ってJListを作成
		list = new JList(model);
 
		// リストモデルは通常スクロールペインを使います。
		ScrollPane sp = new ScrollPane();
		sp.add(list);
 
		// 自作のセルレンダラーを設定します
		list.setCellRenderer(new FileListCellRenderer());
 
		add(sp);
 
	}
 
	public static void main(String[] args) {
		new JListSample2("JListを使ってみよう2");
	}
 
	/**
	 * JList用のセルセンダラー
	 */
	class FileListCellRenderer extends DefaultListCellRenderer {
		FileSystemView fs = FileSystemView.getFileSystemView();
 
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
			super.getListCellRendererComponent(list, value, index, isSelected,
					cellHasFocus);
 
			// valueがFileクラスの場合、テキストとアイコンを設定します。
			if (value instanceof File) {
				File f = (File) value;
				setText(fs.getSystemDisplayName(f));
				setIcon(fs.getSystemIcon(f));
			}
			return this;
		}
	}
}
 
最終更新:2012年10月08日 19:08