2010-11-25 5 views
3

이것은 처음으로 여기에서 묻습니다. 뭔가 적절하지 않으면 용서해주세요. 내 영어가 좋지 않으면 미안 해요.JTable의 마지막 행을 지우는 데 문제가 있습니다.

글자를 짧게하기 위해 현재 스윙으로 자바 데스크톱 앱을 개발 중이며 테이블을 사용하는 데 문제가 있습니다. 각 행에 행을 삭제하는 단추가있는 행이 있습니다. 마지막 행을 삭제하려고 시도 할 때까지 모든 것이 괜찮습니다 (아무 문제없이 행을 삭제할 수 있음). 마지막 행이 삭제 될 수 있습니다하지만 분명히 예외가, 이런 일이 :

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 4 
    at java.util.Vector.elementAt(Vector.java:427) 
    at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:648) 
    at javax.swing.JTable.setValueAt(JTable.java:2710) 
    at javax.swing.JTable.editingStopped(JTable.java:4712) 
    at javax.swing.AbstractCellEditor.fireEditingStopped(AbstractCellEditor.java:125) 

스택 추적에서,이 "4",하지만 난 방법을 모르고 내 이전에 삭제 된 마지막 행 인덱스가없는 것 같다 이것을 처리하십시오. 이미 솔루션을 찾고 있지만 여전히 해결할 수는 없습니다. 마지막 행을 삭제할 때 다른 행이 있고 그 후에 다른 행을 삭제할 수 없습니다. 삭제 버튼을 클릭 할 때도 동일한 예외가 발생합니다.

오. DefaultTableModel의 removeRow()를 사용하여 행을 삭제합니다. 어떤 도움을 주시면 감사하겠습니다. 감사.

편집 다음 코드는 내가 사용하는 코드입니다.

public class ViewDetail extends JInternalFrame implements ActionListener { 
    ... 
    String column[] = { "Aaa", "Bbb", "Delete This"}; 

    tableModel = new DefaultTableModel(); 
    Object row[][] = new Object[size][column.length]; 

    //fill the data from db 
    int r = 0; 
    for (int i = 0; i < size; i++) { 
    row[r][0] = ...; 
    row[r][1] = ...; 
    row[r][2] = "Delete"; 
    r++; 
    } 

    tableModel.setDataVector(row, column); 
    table = new JTable(tableModel); 

    tableColumn = table.getColumn("Aaa"); 
    tableColumn.setPreferredWidth(75); 
    tableColumn = table.getColumn("Bbb"); 
    tableColumn.setPreferredWidth(75); 
    tableColumn = table.getColumn("Delete This"); 
    tableColumn.setPreferredWidth(75); 
    tableColumn.setCellRenderer(new ButtonRenderer()); 
    tableColumn.setCellEditor(new ButtonEditor(new JCheckBox()); 
    ... 
} 

public class ButtonRenderer extends JButton implements TableCellRenderer { 
    public ButtonRenderer() { 
     setOpaque(true); 
    } 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (isSelected) { 
      setForeground(table.getSelectionForeground()); 
      setBackground(table.getSelectionBackground()); 
     } else { 
      setForeground(table.getForeground()); 
      setBackground(UIManager.getColor("Button.background")); 
     } 
     setText((value == null) ? "" : value.toString()); 
     return this; 
    } 
} 

public class ButtonEditor extends DefaultCellEditor { 
    protected JButton button; 
    private String label; 
    private boolean isPushed; 
    private JTable table; 
    public ButtonEditor(JCheckBox checkBox) { 
    super(checkBox); 
    button = new JButton(); 
    button.setOpaque(true); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      fireEditingStopped(); 
      } 
     }); 
    } 

    public Component getTableCellEditorComponent(JTable table, Object value, 
     boolean isSelected, int row, int column) { 
    if (isSelected) { 
     button.setForeground(table.getSelectionForeground()); 
     button.setBackground(table.getSelectionBackground()); 
    } else { 
     button.setForeground(table.getForeground()); 
     button.setBackground(table.getBackground()); 
    } 
    label = (value == null) ? "" : value.toString(); 
    button.setText(label); 
    isPushed = true; 
    this.table = table; 
    return button; 
    } 

    public Object getCellEditorValue() { 
    if (isPushed) { 
        DefaultTableModel tableModel = (DefaultTableModel) table.getModel();        
        tableModel.removeRow(table.getSelectedRow());     
      } 
      isPushed = false; 
    return new String(label); 
    } 

    public boolean stopCellEditing() { 
    isPushed = false; 
    return super.stopCellEditing(); 
} 

protected void fireEditingStopped() { 
     super.fireEditingStopped(); 
    } 
} 
+1

당신은 당신의 코드를 게시 할 수 조각? –

답변

4

스윙이 제거하는 행에 새 값을 설정하려고합니다! remove 코드를 Runnable로 옮기고 swing 유틸리티 클래스에서 invokeLater를 사용하여 실행하십시오.

+0

감사합니다 vickirk. 이제 작동 중입니다. 나는 RemoveRow를 Runnable에 랩핑한다. Swing이 제거하는 행에 새로운 값을 설정하는 방법을 아직도 이해하지 못하고있다. – ordinarydot

+0

좀 더 자세하게 살펴 보겠습니다. remove 코드는 실제로 getEditorValue를 호출하는 중입니다. 따라서 모델에서 값을 설정하려고 시도하는 동안 실제로 제거하는 것이므로 설정 값을 호출 할 때 목록에서 사라집니다. – vickirk

1

당신이 초기화 할 코드를 게시하고 요소를 추가하고 JTable에서 삭제할 수 있습니까?

내 첫번째 추측은 당신도 고전적인 실수 지수

에 0 ~ 3에 테이블을 갈 때 "나는 내가 (4) 제거 마지막을 삭제 내 테이블의 4 개 요소가"를하고있는 것입니다

또는

for(int i = 0; i<lenght; i++){ 
     if(i%2==0){//every even number 
     tab.remove(i); 
     } 
    } 

는 다음이 테이블의 크기를 수정하는 것처럼 같은 루프에 여러 개체를 제거하려고하는이 요소는 이동되지만 제거 할 때 귀하의 계정에 그것을 복용하지.

이들은 단지 문제를 일으킬 수있는 것으로 추측/포인터입니다. 이 코드가 해결되지 않으면 코드를 게시하십시오.

+0

아니요, 하나씩 삭제합니다. 그리고 나는 table.getSelectedRow()를 사용하기 때문에 table.remove() 메소드의 매개 변수로 0부터 시작하는 인덱스를 반환하기 때문에 올바른 인덱스를 사용한다고 확신합니다.코드는 곧 게시 할 예정입니다. – ordinarydot

1

Table Button Column은 열을 단추로 렌더링하는 방법과 단추를 클릭 할 때 실행되는 동작을 추가하는 방법을 보여줍니다. 예제 액션은 단지 행을 삭제하는 방법을 보여줍니다. 여기

+0

링크를 제공해 주셔서 감사합니다. 나는 여전히 내 삭제 단추 구현이 다소 엉망이라고 생각하기 때문에 다른 옵션을 보는 것이 좋습니다. – ordinarydot

+1

@ordinarydot, 예. 구현이 엉망입니다. 솔루션은 해로운 디자인이기 때문에 해킹입니다. getEditorValue()의 기능은 편집기에서 값을 가져 와서 값을 모델에 저장하는 것입니다. 그것은 문제를 해결하기 위해 해킹이 필요한 이유 인 처리를하도록 설계되지 않았습니다. 에디터에는 아직 발견하지 못한 다른 문제가 있습니다. 바로 가기를 사용하는 것은 문제를 해결하는 방법이 아닙니다. – camickr

+0

답장을 보내 주셔서 감사합니다. 정말 고맙습니다. 나는 아직도 Java에서 멍청하다. 그래서 나쁜 설계 (인터넷에서 무작위로 작동하는 구현을 검색)는 모르지만, 잘못된 설계로 인해 지금 당장 코드에 어려움을 겪고있다. – ordinarydot

0

당신은 반복해야 만 0 번째 행을 제거해야

개인 무효 refreshTable() { INT를 rowCount = model.getRowCount(); // System.out.println (rowCount);

for(int i=0;i<rowCount;i++){ 
     model.removeRow(0); 
     //System.out.println(i); 
    } 

} 
0

당신은 새로운 vaiable을 추가 할 수 fireEditingStopped()로 확인 : 삭제 작업을 수행

public class ButtonEditor extends DefaultCellEditor { 

//create new variable 
private boolean isDeleteRow = false; 
///////////////// 

protected JButton button; 
private String label; 
private boolean isPushed; 
private JTable table; 
public ButtonEditor(JCheckBox checkBox) { 
super(checkBox); 
button = new JButton(); 
button.setOpaque(true); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     fireEditingStopped(); 
     } 
    }); 
} 

public Component getTableCellEditorComponent(JTable table, Object value, 
    boolean isSelected, int row, int column) { 
if (isSelected) { 
    button.setForeground(table.getSelectionForeground()); 
    button.setBackground(table.getSelectionBackground()); 
} else { 
    button.setForeground(table.getForeground()); 
    button.setBackground(table.getBackground()); 
} 
label = (value == null) ? "" : value.toString(); 
button.setText(label); 
isPushed = true; 
this.table = table; 

// set false when click to button 
isDeleteRow = false; 
///////////////// 
return button; 
} 

public Object getCellEditorValue() { 
if (isPushed) { 

       // set true when isPushed button 
       isDeleteRow = true; 
       ///////////////// 

     } 
     isPushed = false; 
return new String(label); 
} 

public boolean stopCellEditing() { 
isPushed = false; 
return super.stopCellEditing(); 
} 

protected void fireEditingStopped() { 
    super.fireEditingStopped(); 

    //check if isDeleteRow, remove row 
    if(isDeleteRow) 
    { 
      DefaultTableModel tableModel = (DefaultTableModel) table.getModel();        
      tableModel.removeRow(table.getSelectedRow()); 
    } 
    ///////////////// 
} 
} 
관련 문제