ArrayIndexOutOfBoundsException:在JTable创建/ tablechanged上为-1

s.d*_*s.d 2 java swing multithreading jtable abstracttablemodel

我已经阅读了所有的线程,看起来好像可以解决我的问题,我也在这里阅读了所有的答案,但我仍然在我的智慧结束.我不确定为什么会抛出异常,尽管我觉得这可能与之有关threading.如果确实如此,请告诉我在哪里包括,new Runnable()以及是否,invokeLater()或者invokeAndWait(),因为我已经尝试过无济于事.

请告诉我,我给你的代码导致异常+堆栈跟踪(下面).

编辑:我在调用之前sysoAnnoTable部分中包含了一些s tableChanged并且它们没有出现在控制台中,因此我认为问题必须在应用程序到达那一点之前发生,即从它调用时AAView或者当数据和表模型被实例化时......

编辑II:问题是覆盖的tableChanged方法.这显然会触发异常.我已经删除了这个tableChanged()电话(也没有什么区别).现在我遇到了另一个问题:了解底层数据(AnnoData)的更改如何自动更新表.虽然这可能是针对另一个查询(在扩展的Google搜索之后),但请随时在此主题中发布有用的评论,因为我将继续阅读它...感谢所有有用的评论和提示!

编辑III:*我已经解决了这个问题.我需要实例化另一个对象AnnoData,将其传递给一个新的实例AnnoTableModel,将此实例设置为我的表然后fireTableDataChanged().

编辑IV:好的,所以fireTableDataChanged()(编辑III中使用的)毕竟是不必要的.我仍然想要使用它而不是一直创建新对象.我想我应该问一个新问题......谢谢!

这个方法AAView应该创建一个扩展a的对象JTable,把它放到一个JScrollPane等等(后者确实有效).

private JPanel createAnnoTablePanel() {
    annoTablePanel = new JPanel();
    annoTable = new AnnoTable(aameth);
    setAnnoTable(annoTable);
    JScrollPane scrollPane = new JScrollPane(getAnnoTable());
    annoTablePanel.add(scrollPane);
    return annoTablePanel;
}
Run Code Online (Sandbox Code Playgroud)

这是类AnnoTable(aameth是一个包含访问数据模型的业务逻辑的实例对象,工作正常).

public class AnnoTable extends JTable implements TableModelListener
{

  public AnnoTable(AAMethods aameth)
  {

     int tokenCount = aameth.getTokenCount();

     AnnoData annoData = new AnnoData(aameth); // cf. below, AnnoData is a Vector(Vector<Object>,String[])

     TableModel tableModel = new AnnoTableModel(annoData.getAnnoData(),
     // AnnoTableModel extends AbstractTableModel(Vector, String[])
     annoData.getColTitles());
     setModel(tableModel);
     getModel().addTableModelListener(this);
     TableModelEvent tme = new TableModelEvent(tableModel);
     this.tableChanged(tme);
     setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     setCellSelectionEnabled(true);
     getColumnModel().getSelectionModel().addListSelectionListener(new AnnoTableSelectionListener(this));
     setPreferredScrollableViewportSize(this.getPreferredSize());

  }

  public void tableChanged(TableModelEvent e) {
  int row = e.getFirstRow();
     int column = e.getColumn();
     AbstractTableModel model = (AbstractTableModel)e.getSource();
     String columnName = model.getColumnName(column);
     Object data = model.getValueAt(row, column); // This is where the exception is thrown!
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你需要源代码AnnoTableModel()(这是一个相当通用的扩展AbstractTableModel)或AnnoData(构造一个Vector包含三个Vector<Object>和一个String[]列标题),请告诉我.

这是堆栈跟踪.

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at package.AnnoTable.tableChanged(AnnoTable.java:52)
at javax.swing.JTable.setModel(Unknown Source)
at javax.swing.JTable.<init>(Unknown Source)
at javax.swing.JTable.<init>(Unknown Source)
at package.AnnoTable.<init>(AnnoTable.java:25)
at package.AAView.createAnnoTablePanel(AAView.java:464)
at package.AAView.createNorthPanel(AAView.java:455)
at package.AAView.displayAndAnnotate(AAView.java:444)
at package.AAView.loadProject(AAView.java:333)
at package.AAView.actionPerformed(AAView.java:286)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Actions.actionPerformed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source)
at javax.swing.JMenuBar.processBindingForKeyStrokeRecursive(Unknown Source)
at javax.swing.JMenuBar.processKeyBinding(Unknown Source)
at javax.swing.KeyboardManager.fireBinding(Unknown Source)
at javax.swing.KeyboardManager.fireKeyboardAction(Unknown Source)
at javax.swing.JComponent.processKeyBindingsForAllComponents(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(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.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(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$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$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)
Run Code Online (Sandbox Code Playgroud)

我可以EDT从那里了解到,所以我可能知道这可能是一个线程问题.但是,我不知道如何找到我应该在哪里开始一个新的Thread(或调用一个new Runnable().

另外,当我改为AnnoTable扩展JTable而不是扩展时,Exception才开始出现JPanel.最初我AnnoTable不仅构建了表,还将其包装在滚动窗格中并将其添加到新窗口中JPanel.但是因为我想fireTableDataChanged从一个只知道的类AAView(也有一个setAnnoTable()方法)我想以正确的方式去做,而在它工作之前就好了.墨菲定律?

kle*_*tra 5

rowIndex为-1(== TableModelEvent.HEADER_ROW)表示模型的结构已完全更改.这样的事件由JTable在setModel上内部触发.阅读TableModelEvent的api文档,以完全理解在侦听器的tableChanged中期望的类型/值.

BTW,@ AKJ是对的 - 不需要在表代码中触发任何TableModelEvents.使模型适当地触发事件