如何从我的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;
}
}
答案 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);