2012-04-23 4 views
0

내 응용 프로그램에서 JTable 행에 TableRowSorter를 적용한 경우 정렬이 제대로 작동하고 Row Sorter 코드가 제공됩니다. DefaultTableModel에 행을 삽입하면 정렬 후 isertion에 오류가 발생합니다. JTable 열 데이터

TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel); 
tableMain.setRowSorter(sorter); 

내 응용 프로그램에서의 JTree와 JTable가이

는 JTree에이 폴더를 포함하고 JTable는, JTree가 노드에서 선택한 폴더의 데이터 (파일과 하위 폴더 정보)를 보여줍니다. 나는의 JTree에서 노드를 클릭하면 내가 JTable의에서 콜 럼 중 하나를 정렬하고 JTree에 다시 와서 약간의 인접 노드를 클릭 할 때 그것은

public void populateTable(Vector<FileData> vList) 
{ 
    treePath = treeMainView.getSelectionPath(); 

    FileData metaData; 
    ImageIcon icon = new ImageIcon("images/folder.png"); 

    dtModel.getDataVector().removeAllElements(); 

    for (int i = 0; i < vList.size(); i++) 
    { 
     Vector v = new Vector(); 
     metaData = (FileData) vList.get(i); 
     if (metaData.isIsdirectory()) { 
      v.add(icon); 
     } else { 
      v.add(UtilClass.getIcon(metaData.getClientpath())); 
     } 
     v.add(metaData.getName()); 
     v.add(metaData.getClientpath()); 
     if (metaData.isIsdirectory()) 
     { 
      v.add(""); 
     } 
     else 
     { 
      v.add((FileHelper.getSizeString(metaData.getSize()))); 
     } 
     if (metaData.isIsdirectory()) { 
      v.add(""); 
     } 
     else 
     { 
      v.add(new Date(metaData.getTime())); 
     } 
     if (metaData.isIsdirectory()) { 
      v.add("Folder"); 
     } 
     else 
     { 
      v.add(UtilClass.getIcon(metaData.getClientpath())); 
     } 



     tableModel.insertRow(i, v); 

    } 
    tableMain.repaint(); 
} 

문제의 arrise 아래에 주어진다의 JTable를 JTable의를 채우는 제대로 코드를 채 웁니다 그 세부 사항은 다음의 예외가 발생 시킬수 것이다 볼의 JTree가 How to Use Tables: Sorting and Filtering에서 논의 된 바와 같이 숨김 예외

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 4 >= 1 
at java.util.Vector.elementAt(Vector.java:427) 
at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:632) 
at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getValueAt(TableRowSorter.java:252) 
at javax.swing.table.TableRowSorter$TableRowSorterModelWrapper.getStringValueAt(TableRowSorter.java:268) 
at javax.swing.DefaultRowSorter.compare(DefaultRowSorter.java:935) 
at javax.swing.DefaultRowSorter.access$100(DefaultRowSorter.java:95) 
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1359) 
at javax.swing.DefaultRowSorter$Row.compareTo(DefaultRowSorter.java:1349) 
at java.util.Arrays.binarySearch0(Arrays.java:2001) 
at java.util.Arrays.binarySearch(Arrays.java:1943) 
at javax.swing.DefaultRowSorter.insertInOrder(DefaultRowSorter.java:983) 
at javax.swing.DefaultRowSorter.rowsInserted0(DefaultRowSorter.java:1041) 
at javax.swing.DefaultRowSorter.rowsInserted(DefaultRowSorter.java:851) 
at javax.swing.JTable.notifySorter(JTable.java:4267) 
at javax.swing.JTable.sortedTableChanged(JTable.java:4115) 
at javax.swing.JTable.tableChanged(JTable.java:4392) 
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280) 
at javax.swing.table.AbstractTableModel.fireTableRowsInserted(AbstractTableModel.java:215) 
at javax.swing.table.DefaultTableModel.insertRow(DefaultTableModel.java:359) 
at org.mycom.gui.MyClass.populateTable(MyClass.java:5866) 
at org.mycom.gui.MyClass$Selection.valueChanged(MyClass.java:5753) 
at javax.swing.JTree.fireValueChanged(JTree.java:2820) 
at javax.swing.JTree$TreeSelectionRedirector.valueChanged(JTree.java:3191) 
at javax.swing.tree.DefaultTreeSelectionModel.fireValueChanged(DefaultTreeSelectionModel.java:629) 
at javax.swing.tree.DefaultTreeSelectionModel.notifyPathChange(DefaultTreeSelectionModel.java:1078) 
at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPaths(DefaultTreeSelectionModel.java:287) 
at javax.swing.tree.DefaultTreeSelectionModel.setSelectionPath(DefaultTreeSelectionModel.java:170) 
at javax.swing.JTree.setSelectionPath(JTree.java:1598) 
at javax.swing.plaf.basic.BasicTreeUI.selectPathForEvent(BasicTreeUI.java:2316) 
at javax.swing.plaf.basic.BasicTreeUI$Handler.handleSelection(BasicTreeUI.java:3525) 
at javax.swing.plaf.basic.BasicTreeUI$Handler.mousePressed(BasicTreeUI.java:3464) 
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:262) 
at java.awt.Component.processMouseEvent(Component.java:6213) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) 
at java.awt.Component.processEvent(Component.java:5981) 
at java.awt.Container.processEvent(Container.java:2041) 
at java.awt.Component.dispatchEventImpl(Component.java:4583) 
at java.awt.Container.dispatchEventImpl(Container.java:2099) 
at java.awt.Component.dispatchEvent(Component.java:4413) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4217) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) 
at java.awt.Container.dispatchEventImpl(Container.java:2085) 
at java.awt.Window.dispatchEventImpl(Window.java:2475) 
at java.awt.Component.dispatchEvent(Component.java:4413) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+1

모델의 잘못된 사용 : 절대로 기본 데이터 구조를 변경하지 마십시오! 대신, 항상 _ 모델 _API를 사용합니다. 코드 스 니펫에서는 두 가지를 혼합합니다 (리스너에 대한 알림없이 기본 벡터에서 제거하고 모델을 통해 삽입). 참고 : 뷰에서 다시 그리기를 호출 할 필요가 없습니다. 마술처럼 뭔가를 해결하는 것으로 보이면 어딘가에서 심각한 문제가 발생합니다. 일반적으로 누락되거나 잘못된 알림입니다. – kleopatra

답변

3

대해서 설명된다하는 JTable 뷰 좌표 하지 동일한 행 TableModel 모델 좌표이다. JTable은이 두 가지 사이에서 변환하는 메소드를 제공하는데, 여기서는이 컨텍스트에서 필요할 수 있습니다. 한 가지 증상은 끌어서 열 순서를 올바르게 처리하지 못하는 테이블입니다.

0

시도 :

table.convertColumnIndexToModel(viewColumnIndex) 
    table.convertRowIndexToModel(viewRowIndex) 

원하는 실제 행이나 열을 검색 할 수 있습니다.