从ArrayList创建DefaultTable

时间:2014-10-24 10:32:00

标签: java swing arraylist jtable renderer

如何从我的ArrayList创建DefaultTable:

public class FileModel extends AbstractTableModel implements TableModel{

    List<Object[]> data = new ArrayList<>();

    String titles[] = new String[] { "File Name", "Pages", "Media Box Height", "Media Box Width", "Trim Box Height",
            "Trim Box Width", "Path", "Error" };
    Class<?> types[] = new Class[] { String.class, Integer.class, Integer.class, Integer.class, Integer.class,  Integer.class, String.class, String.class };

我想将它用于颜色渲染器,因为目前渲染器只是为“字符串”着色...... DefaultModel应如下所示:

DefaultTableModel model = new DefaultTableModel(data, columnNames) {
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };

我目前的Colorrenderer看起来如此:

    public class ColorRenderer extends DefaultTableCellRenderer {

    static final long serialVersionUID = 1L;
    final int STATUS_COL = 7;

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int col) {

        Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
        String type = (String) table.getModel().getValueAt(row, 7);
        if ("Error" == type) {
            component.setBackground(Color.RED);
            component.setForeground(Color.WHITE);

        } else if (isSelected) {
            component.setBackground(table.getSelectionBackground());
            component.setForeground(table.getSelectionForeground());

        } else {
            component.setBackground(table.getBackground());
            component.setForeground(table.getForeground());
        }

        return component;

    }
}

1 个答案:

答案 0 :(得分:1)

只有一些提示可以帮助您解决问题。

1)常见的错误是要求模型获取第一行值以检索列类。这只是 错误 。如果模型是空的怎么办?我们会得到NullPointerException。由于我们知道模型(我们正在建模),我们完全有能力返回适当的类。例如:

DefaultTableModel model = new DefaultTableModel(data, columnNames) {
    @Override
    public Class<?> getColumnClass(int column) {
        // return getValueAt(0, column).getClass(); NO! Never do we have to do this.
        switch (column) {
            case 0: return String.class;
            case 1: return Integer.class;
            ...
            case 7: return String.class;
                default: throw new ArrayIndexOutOfBoundsException(column);
    }
};

2)在ColorRenderer课程中,比较字符串时出现错误:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
    ...
    if ("Error" == type) { // This should be "Error".equals(type)
        ...
    }
    ...
}

请参阅How do I compare strings in Java?

此外,row变量表示视图中的行索引而不是模型,所以此行:

String type = (String) table.getModel().getValueAt(row, 7);

如果表已排序,则可能无法返回预期值。您需要像这样转换索引:

int modelIndex = table.convertRowIndexToModel(row);
String type = (String) table.getModel().getValueAt(modelIndex, 7);

3)关于这个问题:&#34;如何从我的ArrayList创建一个DefaultTable:&#34;

如果您要实现自己的表格模型而不是DefaultTableModel,请参阅this Q&A中检查的选项。

修改

  

唯一的想法是只有字符串是彩色的......但是我有4个整数的列,它们仍保留在表格背景颜色中。

答案取决于你如何设置默认渲染器,但我怀疑你是这样做的:

table.setDefaultRenderer(Object.class, new ColorRenderer());

哪个适用于String类但不适用于Integer类,因为第二个类具有由表提供的默认渲染器,必须明确替换,而第一个不具有。{1}}类。有关渲染器/编辑器选择的完整且更好的说明,请参阅Concepts: Editors and Renderers。出于实际目的,只需这样做:

TableCellRenderer renderer = new ColorRenderer();
table.setDefaultRenderer(Number.class, renderer); // This will work for Integer, Double, Float...
table.setDefaultRenderer(Object.class, renderer);