tanakahdaのプログラマ手帳

プログラミングとかソフトウェア開発とかの備忘録

JListの元データに、追加で文字を付与したJLabelをカスタムセルにしてみる@Java Swing

/** リストの元データ */
private String[] data = {"Tanaka", "Tomita", "Ito"};

f:id:tanakahda:20220326231217p:plain

package com.tanakahda.apps.swing.jlist.customcell.simple_customcell;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;

public class JListSample extends JFrame {
    
    /** リストの元データ */
    private String[] data = {"Tanaka", "Tomita", "Ito"};
    
    public static void main(String[] args) {
        JListSample frame = new JListSample();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(10, 10, 250, 130);
        frame.setVisible(true);
    }

    public JListSample() {
        JList<String> list = new JList<String>(data);
        list.setCellRenderer(new SimpleCellRenderer());
        getContentPane().add(list, BorderLayout.CENTER);
    }
    
    /**
    * カスタムセル
    */
    class SimpleCellRenderer implements ListCellRenderer<String> {
        
        JLabel label;
        
        public SimpleCellRenderer() {
            label = new JLabel();
            label.setOpaque(true);
        }
        
        @Override
        public Component getListCellRendererComponent(
                JList<? extends String> list, String value, int index,
                boolean isSelected, boolean cellHasFocus) {

            label.setText("Hello, Dear " + value + ".");
            
            // カスタムセルにすると選択状態がわからなくなるので色をつける
            if (isSelected) {
                label.setBackground(Color.BLUE);
                label.setForeground(Color.WHITE);
            } else {
                label.setBackground(Color.WHITE);
                label.setForeground(Color.BLACK);
            }
            
            return label;
        }
    }
}