【问题标题】:Sorted JTable's data refresh gives exception in java : Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException排序的 JTable 的数据刷新在 java 中出现异常:线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2014-06-03 16:10:03
【问题描述】:

我尝试制作有关 JTable 输入和刷新的测试代码。

插入和删除运行良好, 但如果我在对表格进行排序后删除或插入数据,则会出现异常:

"AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException : 9>=0" ..

这是我的测试代码。

我该如何解决?

还有..还有什么建议吗?

public class Test extends JFrame{

private DefaultTableModel modelTest = new DefaultTableModel();
private JTable tableTest = new JTable(modelTest);
private JScrollPane paneTest = new JScrollPane(tableTest);

private JButton button1 = new JButton("pattern1");
private JButton button2 = new JButton("pattern2");
private JButton button3 = new JButton("delete");

private void compInit(){
    paneTest.setBounds(0, 0,778, 300);
    button1.setBounds(250, 320,80,20);
    button2.setBounds(450,320,80,20);
    button3.setBounds(300,400,80,20);

    DefaultTableModel tmp = modelTest;

    tmp.addColumn("  ");
    tmp.addColumn("col1");
    tmp.addColumn("col2");
    tmp.addColumn("col3");
    tmp.addColumn("col4");
    tmp.addColumn("col5");
    tmp.addColumn("col6");
    tmp.addColumn("col7");

    try {
        tableTest.setDefaultRenderer(Class.forName("java.lang.String"), new DefaultTableCellRenderer());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    tableTest.setAutoCreateRowSorter(true);
    tableTest.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    tableTest.getColumnModel().getColumn(0).setPreferredWidth(20);
    tableTest.getColumnModel().getColumn(1).setPreferredWidth(45);
    tableTest.getColumnModel().getColumn(2).setPreferredWidth(110);
    tableTest.getColumnModel().getColumn(3).setPreferredWidth(60);
    tableTest.getColumnModel().getColumn(4).setPreferredWidth(100);
    tableTest.getColumnModel().getColumn(5).setPreferredWidth(227);
    tableTest.getColumnModel().getColumn(6).setPreferredWidth(100);
    tableTest.getColumnModel().getColumn(7).setPreferredWidth(100);
    tableTest.getTableHeader().setForeground(new Color(105,105,105));

    this.add(button1);
    this.add(button2);
    this.add(button3);
    this.add(paneTest);
}

private void pattern1(){
    for(int i = 0;i<10;i++){
        Vector rowData = new Vector<>();
        rowData.add(false);
        rowData.add(i+1);
        rowData.add("a : " + i);
        rowData.add("b : " + i);
        rowData.add("c : " + i);
        rowData.add("d : " + i); 
        rowData.add("e : " + i); 
        rowData.add("f : " + i); 
        modelTest.addRow(rowData);
    }
}

private void pattern2(){
    for(int i = 0;i<10;i++){
        Vector rowData = new Vector<>();
        rowData.add(false);
        rowData.add(i+1);
        rowData.add("z : " + i); 
        rowData.add("y : " + i);
        rowData.add("x : " + i); 
        rowData.add("w : " + i); 
        rowData.add("v : " + i); 
        rowData.add("u : " + i); 
        modelTest.addRow(rowData);
    }
}

private void delete(){
    DefaultTableModel tmp = modelTest;
    tmp.getDataVector().removeAllElements();
    tableTest.repaint();
}


private void eventInit(){
    button1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            pattern1();
        }
    });
    button2.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            pattern2();
        }
    });
    button3.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            delete();
        }
    });
}

public Test(){
    this.setLayout(null);
    this.compInit();
    this.eventInit();
    this.setSize(778, 500);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setVisible(true);
}

public static void main(String[] ar){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            new Test();
        }
    }); 
}

}


Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 1
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.getValueAt(Unknown Source)
at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getValueAt(Unknown Source)
at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getStringValueAt(Unknown Source)
at javax.swing.DefaultRowSorter.compare(Unknown Source)
at javax.swing.DefaultRowSorter.access$100(Unknown Source)
at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
at java.util.Arrays.binarySearch0(Unknown Source)
at java.util.Arrays.binarySearch(Unknown Source)
at javax.swing.DefaultRowSorter.insertInOrder(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted0(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at javax.swing.JTable.notifySorter(Unknown Source)
at javax.swing.JTable.sortedTableChanged(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at timer.Test.pattern1(Test.java:77)
at timer.Test.access$0(Test.java:66)
at timer.Test$1.actionPerformed(Test.java:106)
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.plaf.basic.BasicButtonListener.mouseReleased(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$200(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)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.DefaultRowSorter.getViewToModelAsInts(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted0(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at javax.swing.JTable.notifySorter(Unknown Source)
at javax.swing.JTable.sortedTableChanged(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableChanged(Unknown Source)
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(Unknown Source)
at javax.swing.table.DefaultTableModel.insertRow(Unknown Source)
at javax.swing.table.DefaultTableModel.addRow(Unknown Source)
at timer.Test.pattern2(Test.java:92)
at timer.Test.access$1(Test.java:81)
at timer.Test$2.actionPerformed(Test.java:111)
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.plaf.basic.BasicButtonListener.mouseReleased(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$200(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)

【问题讨论】:

  • 哇.. 另外.. NullPointerException 也是。
  • 发布整个异常。

标签: java sorting jtable indexoutofboundsexception


【解决方案1】:

每当您直接更改模型向量时,请务必通知容器。您无法通过以下方法做到这一点:

private void delete(){
    DefaultTableModel tmp = modelTest;
    tmp.getDataVector().removeAllElements();
    tableTest.repaint();
}

在 removeAllElements() 之后,您应该调用 tmp.fireTableDataChanged()。比如:

private void delete(){
    DefaultTableModel tmp = modelTest;
    tmp.getDataVector().removeAllElements();
    tmp.fireTableDataChanged();
    tableTest.repaint();
}

原因:直接对模型底层数据向量的更改不会自动传播到视图。您正在以这种方式更改向量,而不是模型。对模型的更改传播到视图。您对 Model.addRow() 的调用会通知视图添加了一行。您的 Vector.removeAllElements() 调用不会通知给视图,因此在调用之后视图和模型不同步(也就是说,如果它们之前都不是空的)。对 Model.fireTableDataChanged 的​​调用通知视图模型中的整个表数据已更改。在此呼叫之后,它们再次同步。当模型和视图不同步时,您可以预期会发生 ArrayOutOfBoundException,例如在排序期间。

【讨论】:

    【解决方案2】:

    我最近也遇到了这个问题——DefaultRowSorter.getViewToModelAsInts 引起的 NullPointerException。

    我的问题是当 SwingWorker 的 doInBackground() 方法中抛出异常时,我试图直接更新 GUI。我找到了我的特定问题here 的确切解决方案。也许这会帮助你或至少为你指明正确的方向,因为如果你的问题是因为你试图从错误的线程操作 GUI,我不会感到惊讶。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多