【问题标题】:Create DefaultTable from ArrayList从 ArrayList 创建 DefaultTable
【发布时间】:2014-10-24 10:31:59
【问题描述】:

如何从我的 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;

    }
}

【问题讨论】:

    标签: java swing arraylist jtable renderer


    【解决方案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 变量代表 view 中的行索引,而不是 model 所以这一行:

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

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

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

    3) 关于这个问题:“如何从我的 ArrayList 创建一个 DefaultTable:”

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

    编辑

    唯一的想法是只有 Strings 是彩色的......但是我有 4 个带有 Integers 的列,它们仍然保持表格背景颜色。 em>

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

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

    这适用于String 类,但不适用于Integer 类,因为第二个具有表提供的默认渲染器并且必须显式替换,而第一个则没有。有关渲染器/编辑器选择的完整和更好的解释,请参阅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);
    

    【讨论】:

    • 非常感谢。我已经实现了您解决方案的第二点,所以我不再需要第一点了。它现在完美运行。唯一的想法是只有 Strings 是彩色的......但是我有 4 个带有 Integers 的列,它们仍然保持表格背景颜色 -.-
    • 哇,这太棒了!谢谢 :-) 现在我真的更进一步了
    • 不客气 :) 如果这个答案对你来说足够好,那么不要忘记accept it。 @okaisan1
    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多