2014-04-19 36 views
0

我嘗試製作關於JTable輸入和刷新的測試代碼。排序JTable的數據刷新在java中發生異常:線程「AWT-EventQueue-0」中的異常java.lang.ArrayIndexOutOfBoundsException

插入和刪除運作良好, 但如果我刪除或插入數據後排序表,使它的異常:

「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) 
+0

哇..另外..NullPointerException也。 – user3329872

+0

發佈整個例外。 – immibis

+0

沒有人幫助我? T.T – user3329872

回答

0

我也有最近這個問題 - 造成DefaultRowSorter.getViewToModelAsInts一個NullPointerException。

對我來說,問題在於我在SwingWorker的doInBackground()方法中拋出異常時試圖直接更新GUI。我找到了我的特殊問題的確切解決方案here。也許這會幫助你,或者至少將你指向正確的方向,因爲如果你的問題是因爲你試圖從錯誤的線程操縱GUI,我不會感到驚訝。

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

原因:直接更改模型的基礎數據向量不會自動傳播到視圖。您正在以這種方式更改Vector,而不是Model。對模型的更改是傳播到視圖。您對Model.addRow()的調用通知View已添加一行。您的Vector.removeAllElements()調用不會被通知給View,因此在調用View和Model之後不會同步(也就是說,如果它們之前都不爲空)。對Model.fireTableDataChanged的調用通知視圖模型中的整個表格數據已更改。這次通話後,他們再次同步。當Model和View不同步時,可能會發生ArrayOutOfBoundException,例如在分揀時。

相關問題