2016-02-15 28 views
1

中的行後,我有一個框架,其中包含一個表和兩個按鈕。錯誤刪除Jtable

enter image description here

1)重複行 2)刪除行

表中第三列組合

我遇到的情況,我重複的空白行,然後單擊最後一排的組合框中選擇該行,然後單擊刪除行按鈕...然後刪除後,每當我嘗試點擊任何單元格,它會給我以下錯誤。

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 6 >= 6 
    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.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source) 
    at javax.swing.DefaultCellEditor$3.stopCellEditing(Unknown Source) 
    at javax.swing.DefaultCellEditor.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$300(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) 

這裏是相關幀的源代碼。

public class UI { 

    JFrame frame; 
    JTable TblFilePane1; 

    UI() 
    { 
     Toolkit kit = Toolkit.getDefaultToolkit(); 
     Dimension screen = kit.getScreenSize(); 

     frame = new JFrame("Web Automation Tool (Selenium)"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //frame.setResizable(false); 
     frame.setLocation(screen.width/5, screen.height/300);  
     frame.setPreferredSize(new Dimension(1000, 820)); 
     frame.pack(); 
     frame.setVisible(true); 

     final JPanel Pane1 = new JPanel(new BorderLayout()); 

     final JPanel FotterPanelPane1 = new JPanel(new BorderLayout()); 


     String columnNamesTestSuitePane1[] = { "Scope ID","Test Suite","Data File Required","Data File Path"}; 
     // Create some data 
     String dataValuesTestSuitePane1[][] = 
     { 
      { "","","Yes","" }, 
     };  


     // Create a new table instance 
     TblFilePane1 = new JTable(dataValuesTestSuitePane1, columnNamesTestSuitePane1); 
     TblFilePane1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
     TblFilePane1.getTableHeader().setReorderingAllowed(false); 
     TblFilePane1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     DefaultTableModel modelPane1 = new DefaultTableModel(dataValuesTestSuitePane1, columnNamesTestSuitePane1); 

     TblFilePane1.setModel(modelPane1); 
     TblFilePane1.setRowHeight(22); 
     final JScrollPane scrollPane1 = new JScrollPane(TblFilePane1); 
     //scrollPane1.setBounds(0, 0, 250, 250); 

     //final LineNumberTableRowHeader TblFilePane1LineNumber = new LineNumberTableRowHeader(scrollPane1, TblFilePane1); 
     //TblFilePane1LineNumber.setBackground(Color.orange); 
     //scrollPane1.setRowHeaderView(TblFilePane1LineNumber); 


     TableColumn ScopeIDPane1 = TblFilePane1.getColumnModel().getColumn(0);   
     ScopeIDPane1.setPreferredWidth(30); 

     TableColumn TSIDPane1 = TblFilePane1.getColumnModel().getColumn(1);   
     ScopeIDPane1.setPreferredWidth(30); 

     TableColumn dfReq = TblFilePane1.getColumnModel().getColumn(2); 
     JComboBox cmbDfReq = new JComboBox(); 
     cmbDfReq.addItem("Yes"); 
     cmbDfReq.addItem("No"); 
     dfReq.setPreferredWidth(40); 

     TableColumn DataFile = TblFilePane1.getColumnModel().getColumn(3);   
     DataFile.setPreferredWidth(490); 

     TableColumn NotEditable = TblFilePane1.getColumnModel().getColumn(0); 
     JTextField ScopeIDNE = new JTextField(); 
     ScopeIDNE.setEnabled(false); 


     TableColumn NotEditableTS = TblFilePane1.getColumnModel().getColumn(1); 
     JTextField TSIDNE = new JTextField(); 
     TSIDNE.setEnabled(false); 

     NotEditableTS.setCellEditor(new DefaultCellEditor(TSIDNE)); 
     NotEditable.setCellEditor(new DefaultCellEditor(ScopeIDNE)); 
     dfReq.setCellEditor(new DefaultCellEditor(cmbDfReq)); 

     Border margin = new EmptyBorder(10, 10, 5, 10); 
     FotterPanelPane1.setBorder(margin); 

     FotterPanelPane1.add(scrollPane1,BorderLayout.CENTER); 

     final JPanel BtnPanelPane1 = new JPanel(); 
     JButton BtnDuplicateRow = new JButton("Duplicate Row"); 
     JButton BtnDeleteRowPane1 = new JButton("Delete Row"); 
     BtnPanelPane1.add(BtnDuplicateRow); 
     BtnPanelPane1.add(BtnDeleteRowPane1); 

     Pane1.add(FotterPanelPane1,BorderLayout.CENTER); 
     Pane1.add(BtnPanelPane1,BorderLayout.SOUTH); 

     frame.add(Pane1); 

     frame.pack(); 

     BtnDuplicateRow.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       // TODO Auto-generated method stub 
       DefaultTableModel model = (DefaultTableModel)TblFilePane1.getModel(); 
       int totalRows = TblFilePane1.getRowCount(); 

       Vector data = model.getDataVector(); 

       int[] rows = TblFilePane1.getSelectedRows(); 
       if(rows.length != 1) 
       { 
        JOptionPane.showMessageDialog(null, "Please Select one row to Duplicate !"); 
       } 

       else 
       { 
        Vector row = (Vector) data.elementAt(rows[0]); 
        row = (Vector) row.clone();      
        model.addRow(row); 
       } 
      } 
     }); 


     BtnDeleteRowPane1.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       // TODO Auto-generated method stub     

       int row = TblFilePane1.getSelectedRow(); 

       if(row < 0) 
       { 
        JOptionPane.showMessageDialog(null, "Please Select a Row to Delete !"); 
        return; 
       } 
       ((DefaultTableModel) TblFilePane1.getModel()).removeRow(row); 

      } 
     }); 

    } 


    public static void main(String args[]) 
    { 
     new UI(); 

    } 
    //frame.setMaximumSize(new Dimension(1000,820)); 
} 
+2

1)爲了更好地提供幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 2)請學習常用的Java命名規則(命名約定 - 例如'EachWordUpperCaseClass','firstWordLowerCaseMethod()','firstWordLowerCaseAttribute',除非它是'UPPER_CASE_CONSTANT')並且一致地使用它。 –

回答

5

當您單擊按鈕時,編輯器仍處於活動狀態。您需要在刪除該行之前停止編輯。

您可以添加以下到您的ActionListener:

if (TblFilePane1.isEditing()) 
    TblFilePane1.getCellEditor().stopCellEditing(); 

你應該把它添加給聽衆。或者您可能想要查看Table Stop Editing以獲取您可以在表格上設置的屬性,以便在表格失去焦點時停止編輯。

此外,變量名稱不應以大寫字符開頭。瞭解並遵循Java Conventions

+0

謝謝! @camickr和LuxxMiner它解決了我的問題......問題是表格單元在刪除行之前處於可編輯狀態......所以通過使用上面的代碼片段,它在刪除之前首先停止單元格編輯。再次感謝 ! – DevX