JListをStripe(しましま)にする方法
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); }