2010-04-19 4 views
6

왜 이것이 재귀하는지 잘 모르겠습니다.TableModelListener에 의한 StackOverflowError

jTable1.getModel().addTableModelListener(new TableModelListener() { 

public void tableChanged(TableModelEvent evt) { 
    int sum = 0; 
    int i=0; 
    for (i =0 ; i<2; i++){ 
    sum = sum + Integer.parseInt(jTable1.getValueAt(0, i).toString()); 
    } 
    jTable1.setValueAt(sum, 0, 2); 
} 

}); 

예외이다 (그것은 반복 계속)

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
     at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277) 
     at javax.swing.JTable.convertColumnIndexToModel(JTable.java:2553) 
     at javax.swing.JTable.getValueAt(JTable.java:2695) 
     at testprogram.guitest.TestTableModel$1.tableChanged(TestTableModel.java:63) 
     at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280) 
     at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259) 
     at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650) 
     at javax.swing.JTable.setValueAt(JTable.java:2719) 

어떤 도움도 인정.

답변

2

JTable.setValueAt는 tablechanged 이벤트를 발생 시키므로 이벤트 핸들러 내에서 반복적으로 이벤트 핸들러를 호출합니다. 테이블이 아닌 모델의 값을 설정하십시오.

+3

나는 이것이 오래되었다는 것을 알고 있지만 테이블의 setValueAt 메서드 또는 모델의 setValueAt 메서드가 사용되는지 여부에 관계없이 테이블 모델이 변경되므로이 문제를 해결하지 못한다는 것을 지적하고 싶습니다. @ jaime의 대답은 최소한 받아 들여진 대답이어야합니다. – mdscruggs

1

업데이트를 위해 이벤트 처리기에서 값을 업데이트하고 있습니다. 이렇게하면 자연스럽게 이벤트 핸들러가 다시 호출됩니다. 다시 호출 할 이벤트 핸들러를 트리거합니다.

업데이트하기 전에 리스너를 제거해야합니다.

0

jlist을 사용할 때 이전에 동일한 문제가 발생했습니다. 내 솔루션은 단순히 코드 줄의 순서를 변경하는 것이 었습니다.

  1. 이미지가있는 jpanel를 모두 받으십시오.
  2. 그냥 stack-overflow errorjlist 처음에 리스너를 추가했다 생성 된 jlist

내가 이전에 한 문제 (다음 이미지와 jpanel의 모든 얻기에 object[]를 추가하기 전에 리스너를 추가합니다.

9

이벤트 핸들러 (tableChanged 메소드)에서 코드와 함께 setValue 메소드를 사용하는 코드를 래핑하여 다음과 같이 수신기를 제거하고 추가하십시오.

public void tableChanged(TableModelEvent e) { 
model.removeTableModelListener(this); 
// YOUR CODE WITH setValueAt calls begins here 
if (ppt == null || cantidad > ppt.getStock()) { 

model.setValueAt(ppt != null ? ppt.getStock() : 0, e.getFirstRow(), 3); 
} 

model.setValueAt(precioUnitario * cantidad, e.getFirstRow(), 4); 

// YOUR CODE with setValueAt calls ends here 
model.addTableModelListener(this); 
} 

유효성 검사를하는 동안 수신기를 일시적으로 사용하지 않도록 설정합니다.

+0

대단히 도움이되었습니다! – skiabox

관련 문제