JListをStripe(しましま)にする方法

JListの仕組み

JListは(視覚的に)配列が縦に並んでるようなものです。


配列といってもStringみたいな文字列が並んでいるわけじゃないです。
デフォルトだと、実はJLabelが並んでいます。
そこで、並んでいるJLabelの背景色を1つおきに変更すればストライプになるという寸法です。

背景の設定方法

javax.swing.DefaultListCellRendererというクラスがあり、JListの描画はこのクラスがしています。


このレンダラーをJListにセットするためのメソッドもAPIで用意されています。
JList#setCellRenderer(ListCellRenderer cellRenderer)
このメソッドを利用して、ListCellRendererの実装クラスDefaultListCellRendererをセットすれば完成。

実装方法

DefaultListCellRendererは自分で実装することになります。

import java.awt.Color;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JLabel;
import javax.swing.JList;

public class StripedListCellRenderer extends DefaultListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        JLabel label = (JLabel) super.getListCellRendererComponent(list, value,
                index, isSelected, cellHasFocus);

        // 奇数行を薄い青にする
        if (index % 2 != 0) {
            if (list.isSelectedIndex(index)) {
                // 選択行はデフォルトの色
                label.setBackground(list.getSelectionBackground());
            } else {
                // 選択してない行は薄い青
                label.setBackground(new Color(240, 240, 255));
            }
        }
        return label;
    }

}


こんな感じ。

    // test
    public static void main(String[] args) {
        String[] listData = {"java", "ruby", "haskell", "silverlight", "life"};
        JList jList = new JList(listData);
        jList.setCellRenderer(new StripedListCellRenderer());
        
        JFrame frame = new JFrame();
        frame.add(jList);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }