2009-06-03 6 views

답변

-1

가장 쉬운 방법은 해당 요소를 모델에서 제거하는 것입니다.

+0

를 확장하지만 표시해야하는 경우 나중에 그 사람? – joycollector

+0

그럼 다시 추가하십시오 :) – willcodejavaforfood

+0

마지막으로 저는 이렇게했습니다 ... 두 개의 데이터 세트 ... 하나는 꽉 찼고, 다른 하나는 fireDataTableChanged가 호출 될 때 채워집니다 ...하지만 느린 것 같습니다 ... – joycollector

7

Sun's Tutorial for JTables을 확인하고 정렬 및 필터링 섹션을 확인하십시오.

+0

Java 1.6에서만 필터링이 잘못되었거나 필터링 되었습니까? – joycollector

+0

예, 두렵습니다. – willcodejavaforfood

+0

<1.6에서 필터링을 시도하려면 swinglabs의 JXTable을 사용하십시오. 소트 기능을 사용해 다른 TableModel를 장식하는 독자적인 TableModel를 작성할 수도 있습니다. – KitsuneYMG

12

행을 필터링하는 데 사용할 수있는 RowFilter<DefaultTableModel, Object> 클래스가 있습니다. DefaultTableModel은 자신의 모델로 대체 될 수 있습니다. ListSelectionEvents을 듣고 예를 들어, 행에 액세스 할 때 필터링하려면 모델의 전체 행 인덱스에 표시되는 행의 인덱스를 번역하는 것을 잊지 마세요 방법

@Override 
public boolean include(Entry entry) { 
    // All rows are included if no filter is set 
    if (filterText.isEmpty()) 
     return true; 

    // If any of the column values contains the filter text, 
    // the row can be shown 
    for (int i = 0; i < entry.getValueCount(); i++) { 
     String value = entry.getStringValue(i); 
     if (value.toLowerCase().indexOf(filterText) != -1) 
      return true; 
    } 

    return false; 
} 

를 구현합니다. 자바뿐만 아니라이하는 기능을 제공합니다

public void valueChanged(ListSelectionEvent e) { 
    ListSelectionModel lsm = (ListSelectionModel) e.getSource(); 

    int visibleRowIndex = ... // Get the index of the selected row 

    // Convert from the selection index based on the visible items to the 
    // internal index for all elements. 
    int internalRowIndex = tableTexts 
      .convertRowIndexToModel(visibleRowIndex); 

    ... 
} 
+0

TY. 하지만 Java 1.5에 대한 해결책을 찾고있었습니다 ... – joycollector

+0

이것은 받아 들여진 대답이어야합니다 –

1

당신은 필터링 값으로 채워 및 사용자 정의 렌더러에서 이러한 구현 각 열에 대한 arraylists을 설정할 수 있습니다. 셀의 전체 행 값이 충족되지 않으면 렌더러는 row + 1을 사용하여 재귀 적으로 자신을 호출합니다.

세포 행이 기준을 충족 않을 경우,이 렌더링됩니다이 다른 ArrayList에 저장 행 번호가 이미이 방법은 고객 렌더러에 최선의 예에 의해 설명, 렌더링 JLabel의

public Component getTableCellRendererComponent(JTable table, Object color, 
     boolean isSelected, boolean hasFocus, int row, int column) { 

    Object value; 
    String s; 

    try { 
     if (row == 0) { 
      drawn[column].clear(); 
     }// drawn is arraylist which stores cols rend 
     if (row > table.getModel().getDataVector.size()) { 
      return null; 
     }// if we go too far 
     if (drawn[column].contains(Integer.toString(row)) == true) { 
      // already rendered? 
      return getTableCellRendererComponent(table, color, isSelected, 
        hasFocus, (row + 1), column); 
     }// render row+1 

     for (int i = 0; i < filters.length; i++) { 
      value = table.getModel().getValueAt(row, i); 
      s = (i == 1) ? df.format(value) : value.toString(); 
      if (filters[i].contains(s) != true) { 
       //try and put in next row, if succeeds when it reaches column 8 it adds row to 
       return getTableCellRendererComponent(table, color, 
         isSelected, hasFocus, (row + 1), column); 
      } 
     } 

     value = table.getModel().getValueAt(row, column); 

     setFont(getFont().deriveFont(Font.BOLD)); 

     if ((isSelected == false)) { 

      if ((column == 1)) { 
       setForeground(Color.magenta); 
      }// just formatting 
      else { 
       setForeground(Color.black); 
       setBackground(Color.white); 
      } 

     } else { 
      setBackground(Color.blue); 
      setForeground(Color.white); 
     } 

     if ((column == 1))// col 1 is a date, other columns strings 
     { 
      setText((value == null) ? "" : df.format(value)); 
     } else { 
      setText((value == null) ? "" : value.toString()); 
     } 

     todayStr = df.format(new java.util.Date()); 
     dateval = table.getModel().getValueAt(row, 1); 
     String datevalStr = df.format(dateval); 
     if (datevalStr.equals(todayStr)) { 
      setForeground(Color.red); 
     } 
     drawn[column].add(Integer.toString(row));// mark row as rendered 

    } catch (Exception e) { 
     e.getMessage(); 
     return null; 
    } 
    return this; 
} 
관련 문제