tanakahdaのプログラマ手帳

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

JListのセルをカスタマイズする(GridBagLayout)@Java Swing

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

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;

public class JListSample extends JFrame{

    public static void main(String[] args){
        JListSample test = new JListSample("JListSample");
        /* 終了処理を変更 */
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        /*
        * x - このコンポーネントの新しい x 座標
        * y - このコンポーネントの新しい y 座標
        * width - このコンポーネントの新しい width
        * height - このコンポーネントの新しい height
        */
        test.setBounds(10, 10, 640, 480);
        test.setVisible(true);
    }

    JListSample(String title){
        setTitle(title);
        String[] initData = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
        JList<String> list = new JList<String>(initData);
        
        MyCellRenderer renderer = new MyCellRenderer();
        list.setCellRenderer(renderer);
        
        JScrollPane sp = new JScrollPane();
        sp.getViewport().setView(list);
        // スクロールのサイズ
        sp.setPreferredSize(new Dimension(640, 480));
        
        JPanel p = new JPanel();
        p.add(sp);
        getContentPane().add(p, BorderLayout.CENTER);
        
    }
    
    
    /**
    * GridBagLayoutの独自セルを返します.
    * @author tanakahda
    */
    class MyCellRenderer extends JPanel implements ListCellRenderer<Object> {
        
        private GridBagLayout gblayout;
        
        public MyCellRenderer() {
            gblayout = new GridBagLayout();
        }
        
        @Override
        public Component getListCellRendererComponent(
                JList<?> list, Object value, int index, boolean isSelected,
                boolean cellHasFocus) {
            JPanel p = new JPanel();
            p.setLayout(gblayout);
            JLabel l1 = new JLabel("label1", SwingConstants.CENTER);
            JLabel l2 = new JLabel("label2", SwingConstants.CENTER);
            JLabel l3 = new JLabel("label3", SwingConstants.CENTER);
            JLabel l4 = new JLabel("label4", SwingConstants.CENTER);
            
            l1.setBorder(new LineBorder(Color.BLACK, 2));
            l2.setBorder(new LineBorder(Color.BLACK, 2));
            l3.setBorder(new LineBorder(Color.BLACK, 2));
            l4.setBorder(new LineBorder(Color.BLACK, 2));
            
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            gbc.gridheight = 2;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l1, gbc);
            p.add(l1);
            
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            gbc.gridheight = 1;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l2, gbc);
            p.add(l2);
            
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.gridwidth = 1;
            gbc.gridheight = 1;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l3, gbc);
            p.add(l3);
            
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.gridwidth = 2;
            gbc.gridheight = 1;
            gbc.insets = new Insets(1, 1, 1, 1);
            gbc.weightx = 1.0;
            gbc.weighty = 1.0;
            gblayout.setConstraints(l4, gbc);
            p.add(l4);
            
            if (isSelected) {
                p.setBackground(Color.gray);
                p.setForeground(Color.white);
            } else {
                p.setBackground(Color.white);
                p.setForeground(Color.black);
            }
            
            return p;
        } 
    }
}