2009-07-03 3 views
2

Wie der Titel sagt, ich frage mich, ob Sie könnten mich auf ein Dokument verweisen, oder geben Sie mir Rat hier, auf das Design (GUI Design) Form, die Hauptteil von jtable besetzt ist, die mehrere Filter hat. Hauptziel ist es, visuelle Unordnung zu vermeiden.JTable Multiple Filter Design Paradigma

+0

Woher kommen die Daten? Eine relationale Datenbank? – Allan

+0

ja, db ... ich suche eine gui design guidline .... – tropikalista

Antwort

4

Ich habe in der Vergangenheit eine einfache TableFilterPanel implementiert, die eine JTextField pro Tabellenspalte hat und die Anpassung regulärer Ausdrücke durchführt, wenn Text in einem bestimmten Feld vorhanden ist. Normalerweise lege ich das als eine Liste von vertikalen Etiketten + Textfeldern dar (d. H., Es ist also ziemlich kompakt).

Meine Schlüsselklasse ColumnSearcher genannt wird, die die Fähigkeit bietet eine RowFilter mit den Inhalten des JTextField herzustellen:

protected class ColumnSearcher { 
    private final int[] columns; 
    private final JTextField textField; 

    public ColumnSearcher(int column, JTextField textField) { 
     this.columns = new int[1]; 
     this.textField = textField; 

     this.columns[0] = column; 
    } 

    public JTextField getTextField() { 
     return textField; 
    } 

    public boolean isEmpty() { 
     String txt = textField.getText(); 
     return txt == null || txt.trim().length() == 0; 
    } 

    /** 
    * @return Filter based on the associated text field's value, or null if the text does not compile to a valid 
    * Pattern, or the text field is empty/contains whitespace. 
    */ 
    public RowFilter<Object, Object> createFilter() { 
     RowFilter<Object, Object> ftr = null; 

     if (!isEmpty()) { 
      try { 
       ftr = new RegexFilter(Pattern.compile(textField.getText(), Pattern.CASE_INSENSITIVE), columns); 
      } catch(PatternSyntaxException ex) { 
       // Do nothing. 
      } 
     } 

     return ftr; 
    } 
} 

Wenn ich wünsche die Filtereinstellungen ich ein „und“ Filter von jedem bauen sich ändern Einzelfilter:

protected RowFilter<Object, Object> createRowFilter() { 
    RowFilter<Object, Object> ret; 
    java.util.List<RowFilter<Object, Object>> filters = new ArrayList<RowFilter<Object, Object>>(columnSearchers.length); 

    for (ColumnSearcher cs : columnSearchers) { 
     RowFilter<Object, Object> filter = cs.createFilter(); 
     if (filter != null) { 
      filters.add(filter); 
     } 
    } 

    if (filters.isEmpty()) { 
     ret = NULL_FILTER; 
    } else { 
     ret = RowFilter.andFilter(filters); 
    } 

    return ret; 
} 

Normalerweise feuern ich ein PropertyChangeEvent, wenn ich die Filter aktualisieren möchten und haben ein Property darauf reagieren und mein Aggregat Filter wieder aufzubauen. Sie können dann den "rowFilter" PropertyChangeEvent auslösen, wenn der Benutzer eines der Textfelder eingibt (z. B. durch Hinzufügen eines DocumentListener zu jedem JTextField).

Hoffe, dass hilft.

+0

Nice one Adamski – willcodejavaforfood