自定义DefaultTableModel动态添加行时数组越界异常的原因与解决
动态添加行到自定义TableModel时抛出ArrayIndexOutOfBoundsException问题
我子类化了DefaultTableModel,让表格能显示JComboBox中的枚举值。当在构造函数中直接向表格添加数据时,代码能正常工作,示例如下:
final List<PageLabel> pageLabels = new ArrayList<>(); // 添加数据 pageLabels.add(....); final PageLabelTableModel tableModel = new PageLabelTableModel(pageLabels);
但我的应用需要从文本文件读取数据,只有在文件处理完成后才应把数据添加到表格,也就是要动态添加行。理论上这很简单,但实际操作时遇到了问题。我写了一个填充表格的方法:
public void fillTable(final List<PageLabel> labels) { for (final PageLabel label : labels) { final Vector<PageLabel> rowData = new Vector<>(); rowData.add(label); tableModel.addRow(rowData); } }
执行这个方法时抛出了以下异常:
Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 at java.base/java.util.Vector.elementAt(Vector.java:466) at java.desktop/javax.swing.table.DefaultTableModel.justifyRows(DefaultTableModel.java:278) at java.desktop/javax.swing.table.DefaultTableModel.insertRow(DefaultTableModel.java:382) at java.desktop/javax.swing.table.DefaultTableModel.addRow(DefaultTableModel.java:357)
我的自定义表格模型类代码如下:
public class PageLabelTableModel extends DefaultTableModel { private static final String[] columnNames = { "Label", "Start page", "Style" }; private final List<PageLabel> pageLabels = new ArrayList<>(); public PageLabelTableModel() { super(columnNames, 0); } @Override public Class<?> getColumnClass(final int column) { return getValueAt(0, column).getClass(); } @Override public int getRowCount() { return pageLabels != null ? pageLabels.size() : 0; } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(final int column) { return columnNames[column]; } @Override public boolean isCellEditable(final int rowIndex, final int columnIndex) { return columnIndex >= 0; } @Override public Object getValueAt(final int rowIndex, final int columnIndex) { final PageLabel pageLabel = pageLabels.get(rowIndex); final Object returnValue; switch (columnIndex) { case 0 -> returnValue = pageLabel.label(); case 1 -> returnValue = pageLabel.startPage(); case 2 -> returnValue = pageLabel.style(); default -> throw new IllegalArgumentException( String.format("Column index %d not found!", columnIndex) ); } return returnValue; } @Override public void setValueAt(final Object value, final int rowIndex, final int columnIndex) { final PageLabel pageLabel = pageLabels.get(rowIndex); switch (columnIndex) { case 0 -> pageLabel.label((String) value); case 1 -> pageLabel.startPage((int) value); case 2 -> pageLabel.style((LabelStyle) value); default -> throw new IllegalArgumentException( String.format("Column index %d not found!", columnIndex) ); } } }
根据建议,补充PageLabel类代码:
public class PageLabel { private String label; private int startPage; private LabelStyle style; // 无参、全参构造方法,getter/setter方法 // 为简洁起见省略 }
用到的枚举类代码:
public enum LabelStyle { DECIMAL("Decimal"), ROMAN_LOWER("Roman lower"), ROMAN_UPPER("Roman upper"), LETTER_UPPPER("Letters upper"), LETTER_LOWER("Letters lower"), NONE("None"); private final String style; LabelStyle(final String style) { this.style = style; } }
内容的提问来源于stack exchange,提问作者menteith
相关产品推荐
相关产品推荐

