2009-06-03 7 views

Répondre

-1

Le meilleur meilleur serait de supprimer l'élément correspondant du modèle.

+0

Mais si je dois montrer Lui encore plus tard? – joycollector

+0

Ensuite, vous l'ajoutez à nouveau :) – willcodejavaforfood

+0

Enfin, j'ai fait de cette façon ... Deux dataSets ... L'un est plein, l'autre se remplit quand fireDataTableChanged a appelé ... Mais j'ai peur qu'il soit lent ... – joycollector

7

Consultez Sun's Tutorial for JTables et consultez la section Tri et filtrage.

+0

Je me trompe ou le filtrage a été activé uniquement dans Java 1.6? – joycollector

+0

Oui, j'ai bien peur. – willcodejavaforfood

+0

JXTable de swinglabs si vous voulez essayer de filtrer en <1.6. Vous pouvez également créer votre propre TableModel qui décore un autre TableModel avec des fonctions de tri. – KitsuneYMG

12

Il existe la classe RowFilter<DefaultTableModel, Object> que vous pouvez utiliser pour filtrer les lignes. Le DefaultTableModel peut être remplacé par votre propre modèle. Pour filtrer, mettre en œuvre la méthode

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

Lorsque vous accédez à des lignes, par exemple écouter ListSelectionEvents, ne pas oublier de traduire l'index de ligne visible à l'index de la ligne complète dans votre modèle. Java fournit une fonction pour cela aussi:

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. Mais je cherchais une solution pour Java 1.5 ... – joycollector

+0

Cela devrait être la réponse acceptée –

1

Vous pouvez configurer un ArrayLists pour chaque colonne qui sont peuplées par des valeurs filtrées et mettre en œuvre ces derniers dans un moteur de rendu personnalisé. Si des valeurs de ligne entières d'une cellule ne sont pas satisfaites, le rendu s'appelle récursivement avec la ligne + 1.

si les cellules ligne ne remplit les critères, il se rend, un autre ArrayList stocke les numéros de ligne déjà rendus, de son mieux expliqué par exemple cette méthode est en renderer client étend 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; 
} 
Questions connexes