如何从 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/