排序的JTable数据刷新在java中给出异常:线程中的异常" AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException

时间:2014-04-19 05:15:46

标签: java sorting jtable indexoutofboundsexception

我尝试制作关于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)

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

每当您直接更改模型向量时,请务必通知容器。您无法通过以下方法执行此操作:

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();
}

原因:直接更改模型的基础数据向量不会自动传播到View。您正在以这种方式更改Vector,而不是模型。模型的更改传播到View。您对Model.addRow()的调用通知View已添加一行。您的Vector.removeAllElements()调用未通知View,因此在调用View和Model之后不同步(即,如果它们之前都不为空)。对Model.fireTableDataChanged的调用通知View模型中的整个表数据已更改。在此通话后,他们再次同步。当Model和View不同步时,您可以预期ArrayOutOfBoundException会发生,例如在整理过程中。