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
}
}
}