2009-04-02

Java : JTable の特定の行の文字色を変えたい - 2


JTable の特定の行の文字色を変えたい

詳細
  • 特定の値(error フラグが true の場合)を含む行の文字色を赤色にしたい



import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class Sample extends JFrame {

    public Sample(List<SampleInfo> infoList) {
        SampleTable table = new SampleTable();
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
        table.setData(infoList);
        JScrollPane sp = new JScrollPane(table);
        sp.setPreferredSize(new Dimension(500, 200));
        JPanel panel = new JPanel();
        panel.add(sp);
        getContentPane().add(panel);
    }

    public static void main(String[] args) {
        Sample frame = new Sample(createData());
        frame.setTitle("sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(60, 60, 600, 260);
        frame.setVisible(true);
    }

    private static List<SampleInfo> createData() {
        List<SampleInfo> list = new ArrayList<SampleInfo>();
        SampleInfo info = null;

        info = new SampleInfo();
        info.init("0", "a", true);
        list.add(info);
        info = new SampleInfo();
        info.init("1", "b", false);
        list.add(info);
        info = new SampleInfo();
        info.init("2", "c", false);
        list.add(info);
        info = new SampleInfo();
        info.init("3", "d", true);
        list.add(info);

        return list;
    }

    public class SampleTable extends JTable {

        private Map<String, SampleInfo> infoMap;

        public SampleTable() {
            super(new DefaultTableModel(new String[] { "key", "value" }, 0));
        }

        @Override
        public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
            Component c = super.prepareRenderer(tcr, row, column);
            String value = getValueAt(row, 0).toString();
            if (infoMap != null && !infoMap.isEmpty()) {
                SampleInfo info = infoMap.get(value);
                if (info.isError()) {
                    c.setForeground(Color.RED);
                } else {
                    c.setForeground(Color.BLACK);
                }
            } else {
                c.setForeground(Color.BLACK);
            }
            return c;
        }
        
        public void setData(List<SampleInfo> infoList) {
            if (infoList == null || infoList.isEmpty()) {
                return ;
            }

            DefaultTableModel model = (DefaultTableModel) getModel();
            if (model == null) {
                model = new DefaultTableModel();
            } else {
                for (int i=model.getRowCount()-1; i>-1; i--) {
                    model.removeRow(i);
                }
            }
            
            this.infoMap = new HashMap<String, SampleInfo>();
            for (SampleInfo info : infoList) {
                if (info != null) {
                    infoMap.put(info.getKey(), info);
                    model.addRow(info.getData());
                }
            }
        }

        public void clear() {
            DefaultTableModel model = (DefaultTableModel) getModel();
            if (model != null) {
                for (int i=model.getRowCount()-1; i>-1; i--) {
                    model.removeRow(i);
                }
            }
        }
    }

    public static class SampleInfo {

        private String key;
        private String value;
        private boolean error;

        public SampleInfo() {
        }

        public void init(String k, String v, boolean e) {
            this.key = k;
            this.value = v;
            this.error = e;
        }

        public String getKey() {
            return key;
        }
        public String getValue() {
            return value;
        }
        public boolean isError() {
            return error;
        }

        public Object[] getData() {
            List<Object> list = new ArrayList<Object>();
            list.add(createObject(key));
            list.add(createObject(value));
            return list.toArray();
        }

        private Object createObject(final String item) {
            return new Object() {
                @Override
                public String toString() {
                    return item;
                }
            };
        }
    }
}



前回 ので、特定のカラム(前回の場合は 6 カラム目(項目 F の列))を非表示にできればよかったのだけれども、提供されてる API でできるのかどうかもわからなかったので javax.swing.JTable クラスを拡張してみた。

どうだろか。SampleTable#setData(java.util.List) がなんだかどうにかならないものかと思ったり思わなかったり。まぁ、いいや。



環境
OS   : Windows XP Pro sp2
java : jdk1.6.0_11

0 件のコメント:

コメントを投稿