java - 从 ArrayList 创建默认表

标签 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) 一个常见的错误是向模型询问第一行值以检索列类。这根本就是错误。如果模型为空怎么办?我们将得到一个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 中的行索引,而不是模型,因此这一行:

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 中检查的选项。 .

编辑

The only think is that only Strings are colored...But I have 4 Columns with Integers, they still keep in table background color.

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

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);

关于java - 从 ArrayList 创建默认表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546223/

相关文章:

java - Swing - 停止方法执行,直到前一个方法完成

java - ArrayList 迭代器抛出 ConcurrentModificationException

java - 如何将 ArrayList<String> 转换为 char Array,然后向后打印每个单词?

flutter - 在flutter中动态显示数据表布局中的JSON数据

javascript - JDK 8 Nashorn Javascript 引擎限制

java - 将 Action 事件添加到外观菜单项

java - 如何在功能文件中仅在后台运行一次 java 类

java - 如何使用单个滚动条滚动两个或多个 JTable?

java - 尝试显示数组Java中项目的最后一个索引

java - 传递微调值