javax.swing.JListをつかうと、画像付きリストが簡単に作成できる。これはJava2 SDK についている jfc/SwingSet2 のデモにも含まれているので知っている人も多いだろう。リストの項目は本来はjavax.swing.DefaultListModelを使って作成するべきだが、今回は参照するだけなのでお手軽な配列を使っている。
プログラムのポイントは、描画を受け持つComponentを返却するgetListCellRendererComponentメソッドを持つクラスを用意するという点だ。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class ImageList extends JFrame implements ListSelectionListener {
private JList jlist;
public ImageList() {
getContentPane().setLayout(new BorderLayout());
jlist = new JList(new String[]{ “Java”, “C++”, “Lisp”, });
jlist.setCellRenderer(new ImageCellRenderer());
jlist.addListSelectionListener(this);
getContentPane().add(jlist, BorderLayout.CENTER);
setSize(150, 140);
}
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
Object[] selected = jlist.getSelectedValues();
for (int i = 0; i < selected.length; i++) {
System.out.println(selected[i]);
}
}
class ImageCellRenderer extends JLabel implements ListCellRenderer {
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
setText(value.toString());
if (isSelected) {
setForeground(Color.BLUE);
} else {
setForeground(Color.BLACK);
}
setIcon(new ImageIcon("about.png"));
return this;
}
}
public static void main(String[] args) {
ImageList f = new ImageList();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}