Swing CellEditor索引错误导致Scala表(JTable)IndexOutOfBoundException

Swing CellEditor索引错误导致Scala表(JTable)IndexOutOfBoundException,swing,scala,jtable,indexoutofboundsexception,tablecelleditor,Swing,Scala,Jtable,Indexoutofboundsexception,Tablecelleditor,我刚刚遇到了一个奇怪的问题,IndexOutOfBoundException被抛出,原因是AbstractCellEditor试图为不存在的行建立索引。删除最后一行后出现问题。删除最后一行后,每次可能单击表都会抛出相同的异常,直到添加新行。我真的不知道为什么会这样 下面说明了产生异常的异常和一个小型scala示例: Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4

我刚刚遇到了一个奇怪的问题,
IndexOutOfBoundException
被抛出,原因是
AbstractCellEditor
试图为不存在的行建立索引。删除最后一行后出现问题。删除最后一行后,每次可能单击表都会抛出相同的
异常
,直到添加新行。我真的不知道为什么会这样

下面说明了产生异常的
异常
和一个小型
scala
示例:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)
at javax.swing.JTable.setValueAt(Unknown Source)
at javax.swing.JTable.editingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
at javax.swing.AbstractCellEditor.stopCellEditing(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(Unknown Source)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
代码:

单击第二列中的“Del”可以删除一行


你知道是什么导致了这个索引错误吗?

我找到了问题所在

我在编辑仍处于活动状态时删除了该行。在删除行之前,我必须取消编辑

这是为桌子剪下的工作刀:

  val queryTable = new Table {
    model = new DefaultTableModel(Array[Object]("Tag", "Delete"), 0)
    showGrid = false
    peer.getTableHeader().disable()
    peer.getColumnModel().getColumn(1).setMaxWidth(searchButton.preferredSize.width)
    peer.getColumnModel().getColumn(1).setMinWidth(searchButton.preferredSize.width)

    val buttonEditor = new AbstractCellEditor with TableCellEditor {
      var curRow = 0
      val button = new Button
      button.text= "Del"
      button.peer.setBorderPainted(false)
      button.peer.setContentAreaFilled(false)
      button.peer.setOpaque(false)

      listenTo(button)
      reactions += {
        case e: ButtonClicked => {
          cancelCellEditing()
          fireRemoveFromQuery(curRow)
        }
      }

      override def isCellEditable(arg0: EventObject) = true
      override def getCellEditorValue() = "Del"
      override def getTableCellEditorComponent(arg0: JTable, arg1: Any, arg2: Boolean, row: Int, col: Int) = {
        curRow = row
        button.peer
      }
    }
    override def editor(row: Int, column: Int) = {
      column match {
        case 1 => buttonEditor
        case _ => null
      }
    }
  }
   override def getTableCellEditorComponent(tab: JTable, value: AnyRef, isSelected: Boolean,
        row: Int, col: Int): AWTComponent = {
        fireRemoveFromQuery(row)
        label.peer
      }
  val queryTable = new Table {
    model = new DefaultTableModel(Array[Object]("Tag", "Delete"), 0)
    showGrid = false
    peer.getTableHeader().disable()
    peer.getColumnModel().getColumn(1).setMaxWidth(searchButton.preferredSize.width)
    peer.getColumnModel().getColumn(1).setMinWidth(searchButton.preferredSize.width)

    val buttonEditor = new AbstractCellEditor with TableCellEditor {
      var curRow = 0
      val button = new Button
      button.text= "Del"
      button.peer.setBorderPainted(false)
      button.peer.setContentAreaFilled(false)
      button.peer.setOpaque(false)

      listenTo(button)
      reactions += {
        case e: ButtonClicked => {
          cancelCellEditing()
          fireRemoveFromQuery(curRow)
        }
      }

      override def isCellEditable(arg0: EventObject) = true
      override def getCellEditorValue() = "Del"
      override def getTableCellEditorComponent(arg0: JTable, arg1: Any, arg2: Boolean, row: Int, col: Int) = {
        curRow = row
        button.peer
      }
    }
    override def editor(row: Int, column: Int) = {
      column match {
        case 1 => buttonEditor
        case _ => null
      }
    }
  }