2016-10-07 1 views
2

커스텀 모델을 가지는 JTable로 2 개의 조작을 적용합니다.JTable 모델의 fireTableChanged 이벤트가 필터 처리 후에 예외를 슬로우한다

먼저 필터링 연산은 : 런타임 예외가 발생되고,

model.fireTableChanged(new TableModelEvent(model, TableModelEvent.HEADER_ROW)); 

을하지만 :

// rf is a RowFilter object 
((DefaultRowSorter) table.getRowSorter()).setRowFilter(rf); 

후, 다른 스레드는 테이블 항목 이름이 변경되고 이벤트를 실행. 가능한 이유는 무엇일까요?

추적 내용은 다음과 같습니다. 감사.

예외 글 "AWT-EventQueue의-0" java.lang.ArrayIndexOutOfBoundsException : -1 java.util.Vector.elementData (Vector.java:734)에서 에서 java.util.Vector.elementAt com.jtattoo에서 com.jtattoo.plaf.BaseTableHeaderUI.getHeaderRenderer (BaseTableHeaderUI.java:189)에서 javax.swing.table.DefaultTableColumnModel.getColumn (DefaultTableColumnModel.java:294)에서 (Vector.java:477) .plaf.BaseTableHeaderUI.paintCell (BaseTableHeaderUI.java:358) at com.jtattoo.plaf.BaseTableHeaderUI.paint (BaseTableHeaderUI.java:3) 2735) at javax.swing.plaf.ComponentUI.update (ComponentUI.java:161) at 에있는 javax.swing.JComponent.paintComponent (JComponent.java:780) javax.swing.JComponent.paint (JComponent.java : 1056) at 에있는 javax.swing.JComponent.paintChildren (JComponent.java:889) 에서의 javax.swing.Javaponent.paint (JComponent.java:1065) javax.swing.JViewport.paint (JViewport.java:728) 에서 javax.swing.JComponent.paintChildren (JComponent.java:889)에서 javax.swing.JComponent.paint (JComponent.java:1065)에서 javax.swing.JComponent.paintChildren (JComponent.java:889)에서 javax.swing.JComponent.paint (JComponent.java:1065) at 01에서의 javax.swing.JComponent.paintChildren (JComponent.java:889) 23,516, 에서 javax의 javax.swing.JComponent.paint javax.swing.JComponent.paint (JComponent.java:1065)에서 javax.swing.JComponent.paintChildren (JComponent.java:889)에서 (JComponent.java:1065) .swing.JComponent.paintChildren (JComponent.java:889) at javax.swing.JComponent.paint (JComponent.java:1065) at javax.swing.JLayeredPane.paint (JLayeredPane.java:586) at javax.swing .JComponent.paintChildren (JComponent.java:889) at 에있는 javax.swing.JComponent.paint (JComponent.java:1065). 에있는 javax.swing.JComponent.paintChildren (JComponent.java:889). javax.swing.JComponent . paint (JComponent.java:1065) at javax.swing.JComponent.paintChildren (JComponent.java:889) at백45경1천5백15조5백36억9천1백36만3천2백10 에서 javax의 javax.swing.JComponent.paint javax.swing.JComponent.paint (JComponent.java:1065)에서 javax.swing.JComponent.paintChildren (JComponent.java:889)에서 (JComponent.java:1065) .swing.JComponent.paintChildren (JComponent.java:889) at javax.swing.JComponent.paint (JComponent.java:1065) at 에있는 javax.swing.JComponent.paintChildren (JComponent.java:889) javax.swing .JComponent.paint (JComponent.java:1065) at 에있는 javax.swing.JComponent.paintChildren (JComponent.java:889). 에있는 javax.swing.JComponent.paint (JComponent.java:1065). javax.swing.JComponent . paintChildren (JComponent.java : 889) 에서 에서 javax.swing.JComponent.paint (JComponent.java:1065) 에서 javax.swing.JComponent.paintChildren (JComponent.java:889) javax.swing.JComponent.paint (JComponent.java : (JComponent.java : 889), 에있는, 가 javax.swing.RepaintManager $ PaintManager.paintDoubleBuffered에서 javax.swing.JComponent.paintToOffscreen (JComponent.java:5210)에서 javax.swing.JComponent.paint (JComponent.java:1065) (RepaintManager.java:1579)에서 at javax.swing.RepaintManager $ PaintManager.paint (RepaintManager.java:1502) 에서 javax.swing.JComponent.paintImmediately (JComponent.java:4969)에서 javax.swing.JComponent._paintImmediately (JComponent.java:5158)에서 javax.swing.RepaintManager.paint (RepaintManager.java:1272)에서 516,javax.swing.RepaintManager $ 4.run (RepaintManager.java:831) at javax.swing.RepaintManager $ 4.run (RepaintManager.java:814) at java.security.AccessController.doPrivileged (네이티브 메소드) java.security javax.swing.RepaintManager.paintDirtyRegions에서 .ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:76) 에서 javax.swing.RepaintManager.paintDirtyRegions (RepaintManager.java:814) (RepaintManager.java:789)(RepaintManager.java : 738) 에서 javax.swing.RepaintManager.access $ 1200 (RepaintManager.java:64) 에서 javax.swing.RepaintManager $ ProcessingRunnable.run (RepaintManager.java : RepaintManager.java :) 1732) at java.awt.event.InvocationEvent.dispatch (InvocationEvent.java:311) at java.awt.EventQueue.dispatchEventImpl (EventQueue.java:756) java.awt.EventQueue.access $ 500 (EventQueue.java : 97) at java.awt.EventQueue $ 3.run (EventQueue.java:709) at java.awt.EventQueue $ 3.run (EventQueue.java:703) at java.security.AccessController.doPrivileged (네이티브 메소드) at java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionD omain.java:76)

+0

''com.jtattoo.plaf.BaseTableHeaderUI.getHeaderRenderer'' 메소드는 작동하지 않을''DefaultTableColumnModel.getColumn (-1)''을 호출합니다. 이 스택 추적에 어떤 수업이 있습니까? – f1sh

+0

"분류기를 사용할 때는 항상 셀 좌표를 변환해야합니다."- [loc.cit.] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting). – trashgod

+0

@ f1sh 아니요, 관련이 없습니다. 그러나, 나는 EDT에서'fireTableChanged'를 호출합니다. –

답변

0

당신의 스택 트레이스를 보면 나는

com.jtattoo.plaf.BaseTableHeaderUI.getHeaderRenderer(BaseTableHeaderUI.java:189) 

BaseTableHeaderUI의 버그를 추측 때문에 그 javax.swing.table.DefaultTableColumnModel에 대한 호출입니다 위 :

/** 
* Returns the <code>TableColumn</code> object for the column 
* at <code>columnIndex</code>. 
* 
* @param columnIndex  the index of the column desired 
* @return the <code>TableColumn</code> object for the column 
*       at <code>columnIndex</code> 
*/ 
public TableColumn getColumn(int columnIndex) { 
    return tableColumns.elementAt(columnIndex); 
} 

BaseTableHeaderUI처럼 보이는 두 스레드에 문제가 있습니다. 그래서 같은 스레드에서 모든 이벤트를 처리해야합니까? 나의 선택은 Event-Dipatch-Thread가 될 것이다.

+0

감사합니다. 나는 당신이 "두 가지 실마리"를 의미하는 것을 얻지 못했습니다. 모델의'fireModelChanged' 호출은'SwingUtilities.invokeLater' 내부에서 호출됩니다. –

+1

은 (AbstractTableModel)의 일부 여야합니다. fireModelChanged는 모든 변경 사항 (JTable, 모델에 대한 관계, ColumnModel, Editor, Renderer, ...)을 defaults (새 모델 정의에서 나온)로 다시 설정할 수 있으므로 SelectionModel은 – mKorbel

+0

'fireTableChanged' 호출을 제거했습니다. 문제는 @trashgod가 알 수 있듯이 필터 행을 적용한 후에 테이블 행 인덱스 값이 변경된다는 것입니다. 대신 인덱스 값을보고 헤더 값을 설정하여 열을 반복합니다. 그러나 테이블 헤더에'repaint' 메서드를 호출해야했습니다. –