You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:45:55