2013-12-13 3 views
0

내 프로젝트에는 사용자 정의 TableModel이있는 JTable이 관련되어 있습니다. 사용자가 테이블의 각 셀을 수정할 수 있기를 원하기 때문에 사용자 정의 TableModel (CSVModel)이 DefaultTableModel을 확장하도록 선택합니다. 그러나 내 테이블의 셀을 편집하려고 할 때 어떤 이유로 CSVModel에서 예외가 발생합니다.셀의 수정, JTable

예외 스레드에서 "AWT-EventQueue의-0"java.lang.ArrayIndexOutOfBoundsException : 내가 가진 유일한 힌트는 스택 추적의 마지막 줄에서 3> = 0

3에서 것은의 행 번호입니다 내가 수정하려고했던 셀. 어쩌면 범위를 벗어나는 데이터에 문제가있을 수 있습니까? 편집하기 전에

class CSVModel extends DefaultTableModel { 
     private String[] columnNames; 
     private ArrayList<String[]> Data = new ArrayList<String[]>(); 

     public void AddCSVData(ArrayList<String[]> DataIn) { 
      this.columnNames = DataIn.get(0); 
      DataIn.remove(0); 
      this.Data=DataIn; 

      this.fireTableStructureChanged(); 
     } 

     @Override 
     public int getColumnCount() { 
      if (columnNames != null) 
       return columnNames.length;//length; 
      else 
       return 0; 
     } 
     @Override 
     public int getRowCount() { 
      if (Data != null) 
       return Data.size(); 
      else 
       return 0; 
     } 

     public void setRowCount() { 
      Data=null; 
      columnNames=null; 

      this.fireTableStructureChanged(); 
     } 

     @Override 
     public String getColumnName(int col) { 
      System.out.println("getcol"); 
      return columnNames[col]; 
     } 

     @Override 
     public Object getValueAt(int row, int col) 
     { 
      return Data.get(row)[col]; 

     } 

     public ArrayList<String[]> ReadCSVFile(File dataFile) { 
      // When user presses load, read in the selected CSV file 
      CSVFile temp = new CSVFile(); 

      return temp.ReadCSVfile(dataFile); 
     } 

나는 CSV는이 클래스를 사용하여 테이블에 파일을로드 : 다음은 코드가

public class CSVFile { 
      private ArrayList<String[]> Rs = new ArrayList<>(); 
      private String[] OneRow; 

      // Method for reading CSV file 
      public ArrayList<String[]> ReadCSVfile (File DataFile) {    
       try { 
        BufferedReader brd = new BufferedReader (new FileReader(DataFile)); 

        String st = brd.readLine(); 
        while (st != null) { 
         OneRow = st.split(","); 
         Rs.add(OneRow); 
         st = brd.readLine(); 
        } // end of while 
        brd.close(); 
       } // end of try 
       catch (Exception e) { 
        String errmsg = e.getMessage(); 
        System.out.println ("File not found:" +errmsg); 
       } // end of Catch     

       return Rs; 
      }// end of ReadFile method 
     }// end of CSVFile class 

전체 스택 추적 : 스레드

예외 "AWT-EventQueue- 0 "java.lang.ArrayIndexOutOfBoundsException : 3> = 0 java.util.Vector.elementAt (알 수없는 소스)의 의 javax.swing.table.DefaultTableModel.setValueAt (알 수없는 소스) 의 javax.swing.JTable.setValueAt (알 수없는 소 RCE) javax.swing.DefaultCellEditor $ EditorDelegate.stopCellEditing에서 javax.swing.AbstractCellEditor.fireEditingStopped (알 수없는 소스) 에서 javax.swing.JTable.editingStopped (알 수없는 소스) (알 수없는 소스) 에서 javax.swing.DefaultCellEditor에서 javax.swing.JTextField.fireActionPerformed에서 javax.swing.DefaultCellEditor $ EditorDelegate.actionPerformed (알 수없는 소스) 에서 javax.swing.JTable를 $ GenericEditor.stopCellEditing (알 수없는 소스) (알 수없는 소스) 에서 .stopCellEditing (알 수없는 소스) javax.swing.JTextField.postActionEvent (Unknown Source) (javax.swing.JTextField) $ NotifyAction.actionPerformed (알 수없는 소스) (javax.swing.SwingUtilities.notifyAction) (알 수없는 소스) 알 java.awt.Component.processEvent에서 javax.swing.JComponent.processKeyEvent (알 소스)에 javax.swing.JComponent.processKeyBinding (알 소스)에 javax.swing.JComponent.processKeyBindings (알 소스)에 (에서 java.awt.Container.processEvent (알 수없는 소스) 에서 java.awt.Component.dispatchEventImpl (알 수없는 소스) at java.awt.Container.dispatchEventImpl (알 수없는 소스) at java.awt.Component.dispatchEvent (알 수없는 소스) at java.awt.KeyboardFocusManager.redispatchEvent (알 수없는 소스) at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent (알 수없는 소스) at java.awt.DefaultKeyboardFocusManager.preDispatchKey 이벤트 (알 수없는 소스) java.awt.DefaultKeyboardFocusManager.typeAheadAssertions에서 (알 수없는 소스) java.awt의에서 java.awt.DefaultKeyboardFocusManager.dispatchEvent (알 수없는 소스) java.awt.Component.dispatchEventImpl에서 (알 수없는 소스) 에서 . Container.dispatchEventImpl (알 수없는 소스) at java.awt.Window.dispatchEventImpl (알 수없는 소스) at java.awt.Component.dispatchEvent (알 수없는 소스) at java.awt.EventQueue.dispatchEventImpl (알 수없는 소스) at java. awt.EventQueue.access $ 200 (Unknown Source) at java.awt.EventQueue $ 3.run (알 수없는 소스) at java.awt.EventQueue $ 3.run (알 수없는 소스) at java.security.AccessController.doPrivileged (네이티브 M ethod) at java.security.ProtectionDomain $ 1.자바에서 java.awt.EventQueue $의 4.run에서 java.awt.EventQueue $의 4.run에서 java.security.ProtectionDomain $ 1.doIntersectionPrivilege (알 수없는 소스) (알 수없는 소스) (알 수없는 소스) 에서 doIntersectionPrivilege (알 수없는 소스) java.awt.EventDispatchThread.pumpOneEventForFilters에서 java.awt.EventQueue.dispatchEvent (알 수없는 소스) 에서 java.security.ProtectionDomain $ 1.doIntersectionPrivilege (알 수없는 소스) 에서 .security.AccessController.doPrivileged (기본 방법) (알 수없는 소스) 의 java.awt.EventDispatchThread.pumpEventsForFilter (알 수없는 소스) 의 java.awt.EventDispatchThread.pumpEventsForHierarchy (알 수없는 소스) 의 java.awt.EventDispatchThread.pumpEvents (알 수없는 소스)java.awt.EventDispatchThread.run에서 java.awt.EventDispatchThread.pumpEvents (알 수없는 소스) (알 수없는 소스) 도움을

감사에서!

답변

0

해결책은 DefaultTableModel 대신 AbstractTableModel을 확장하는 것이 었습니다.

@Override 
public boolean isCellEditable(int row, int col) { 
      return true; 
      } 
@Override 
     public void setValueAt(Object value, int row, int col) { 

      Data.get(row)[col] = (String) value; 

      fireTableCellUpdated(row, col); 
     } 
: 나는 또한 AbstractTableModel가 두 가지 방법의 적절하게 오버로드 된 버전을 포함했다
관련 문제