2009-06-03 15 views

Antwort

-1

Die beste einfachste Weg wäre, das entsprechende Element aus dem Modell zu entfernen.

+0

Aber wenn ich brauche, um zu zeigen, ihm später wieder? – joycollector

+0

Dann fügen Sie es wieder :) – willcodejavaforfood

+0

Endlich habe ich diesen Weg ... Zwei dataSets ... Einer ist voll, der andere füllt, wenn fireDataTableChanged aufgerufen ... Aber ich fürchte, es ist langsam ... – joycollector

7

Schauen Sie sich Sun's Tutorial for JTables an und sehen Sie sich den Sortier- und Filterbereich an.

+0

Ich bin falsch oder Filterung wurde nur in Java 1.6 aktiviert? – joycollector

+0

Ja, ich habe Angst. – willcodejavaforfood

+0

JXTable von Swinglabs, wenn Sie versuchen möchten, in <1.6 zu filtern. Sie können auch ein eigenes TableModel erstellen, das ein anderes TableModel mit Sortierfunktionen darstellt. – KitsuneYMG

12

Es gibt die Klasse RowFilter<DefaultTableModel, Object>, mit der Sie Zeilen ausfiltern können. Das DefaultTableModel kann durch ein eigenes Modell ersetzt werden. Um Filter, implementieren die Methode

@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; 
} 

Wenn Zeilen zugreifen, zum Beispiel auf ListSelectionEvents hören, vergessen Sie nicht den sichtbaren Zeilenindex zur vollständigen Zeilenindex in Ihrem Modell zu übersetzen. Java bietet eine Funktion für diese auch:

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. Aber ich suchte nach einer Lösung für Java 1.5 ... – joycollector

+0

Dies sollte die akzeptierte Antwort sein –

1

Sie können Arraylisten für jede Spalte einrichten, die für von Werten ausgefüllt werden gefiltert und diese in einem benutzerdefinierten Renderer implementieren. Wenn die Zeilenwerte einer Zelle nicht vollständig erfüllt sind, ruft der Renderer rekursiv sich selbst mit der Zeile + 1 auf.

, wenn die Zellen Reihe Kriterien nicht erfüllt, es gerendert wird, eine andere Arraylist speichert die Zeilennummern bereits gemacht, seine besten durch Beispiel erläutert dieses Verfahren ist in der Kunden Renderer erweitert 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; 
}