2013-12-03 4 views
1

최근에 이상한 문제가 발생했습니다. 나는 개체의 DefaultTableModel에 속하는 TableModelListener에서 행을 제거하려고 할 때마다, 나는 여기 ArrayOutOfBounds 예외 0> = 0> = 1 : 1 (나는 선택에 따라 달라집니다) 내가 찾은 비슷한 문제가 무엇입니까 :DefaultTableModel 객체에서 행 제거

java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 attempting to populate JTable

그러나 아직까지는 고칠 수 없었습니다. 내 목적은 사용자가 콤보 박스에서 삭제 옵션을 선택했을 때, 나는 단지 그 행을 완전히 제거하기를 원할 때이다. removeRow() 메서드는 청취자의 외부에서 제대로 작동합니다. 코드 및 설명은 다음과 같습니다.

String[] columnNames = {"Kargo ID", 
       "Alıcı Adres", 
       "Ağırlık(KG)", 
       "Tutar(TL)", 
       "Alım Saati","Durum","İletim Saati"}; 

     Object[][] data = { 
       {new Integer(3), "Sinan Caddesi", 
        new Integer(100), new Integer(5),"" ,"",""}}; 



     final DefaultTableModel dtm = new DefaultTableModel(data,columnNames); 
     final JTable table = new JTable(dtm){ 
      @Override 
      public boolean isCellEditable(int row, int column) { 
       return column == 5;//Combobox column 
      } 

     }; 

     //Making Combobox 
     TableColumn c = table.getColumnModel().getColumn(5); 
     JComboBox comboBox = new JComboBox(); 
     comboBox.addItem(""); 
     comboBox.addItem("Delete"); 

     c.setCellEditor(new DefaultCellEditor(comboBox)); 

     //System.out.println(dtm.getRowCount()); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(false); 

     //I printed row and column numbers, they re correct. 
     dtm.addTableModelListener(new TableModelListener() { 

      @Override 
      public void tableChanged(TableModelEvent e) { 
       int row = e.getFirstRow(); 
       int column = e.getColumn(); 
       DefaultTableModel model = (DefaultTableModel)e.getSource(); 
       Object data = model.getValueAt(row, column); 
       //System.out.println(data); DATA IS CORRECT 
       if(((String)data).equals("Delete")) 
        dtm.removeRow(row);//Exception Here 

       //System.out.println(row + " " + column); 
      } 
     }); 

중요한 점이 있습니까? 어떤 도움을 주시면 감사하겠습니다.

+1

를 살펴 보자 super.setValueAt(...)

를 호출해야 당신이 그것을 등등 수정할 때 테이블 모델이 다른 테이블 변경 이벤트를 발생시키기 때문에 테이블 모델을 수정하는 ans ... [이 예제를보십시오 (http://stackoverflow.com/questions/) 12795442/how-can-remove-current-row-in-jtable-when-click-jbutton/12795907 # 12795907) 더 좋은 아이디어를 위해서 – MadProgrammer

+0

다음 테이블에서 데이터 변경 내용을 듣는 방법? 나는 이미 테이블 대신 combobox에 actionListener를 추가하려고 시도했지만 결과는 동일했습니다. – nihirus

+1

변경 내용을 듣고 변경 내용을 기반으로 수정하는 작업은 두 가지가 있습니다. 연결된 예제를 보자. – MadProgrammer

답변

3

TableModel#setValue이 호출되면 "매우"기본적인 아이디어는 수정 된 column을 확인하려는 것입니다. column5 (이 경우) 인 경우, 예를 들어

...

public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
    if (columnIndex == 5) { 
     if ("Delete".equals(aValue)) { 
      removeRow(rowIndex); 
     } 
    } 
} 

이 기억 ... 값이 무엇인지 확인하는 것이 좋습니다, 위의 예는의 기본 동작을 오버라이드 (override) 당신이 모델의 업데이트에 값에 의존 있다면 setValueAt, 그래서, 당신은`TableModelListener`가 적절한 나 아닌 사용 How to use tables

+0

나는 무엇을 말 할 지 모른다. 정말 고마워요. 방금 DefaultTableModel로 확장되고 setValueMethod를 재정의하고 Dtm 클래스에서 직접 내부 클래스가 아닌 새 객체를 정의한 내부 클래스를 만들었습니다. 그리고 일이 끝났습니다. 좋은 하루 되세요!^_^ – nihirus

+0

만나서 반갑습니다.) – MadProgrammer

관련 문제