2009-06-03 5 views

答えて

-1

ベスト最も簡単な方法は、対応する要素をモデルから削除することです。

+0

を拡張しかし、彼は後でまた? – joycollector

+0

それではもう一度追加してください:) – willcodejavaforfood

+0

最後に私はこのようにしました... 2つのデータセット... 1つはいっぱいですが、もう1つは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; 
} 

を実装します。 Javaは、同様にこの機能を提供します。

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

あなたがのためにフィルタリングされた値が移入されている各列の配列リストを設定し、カスタムレンダラでこれらを実装することができます。セルの行全体の値が一致しない場合、レンダラーは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; 
} 
関連する問題