2つの異なるレベルでフィルタリングしたいテーブルを作成しました。まず、ファイル拡張子like(.jpg、.doc、その他)のラジオボタンでフィルタリングします。2番目にtextFieldでフィルタリングして、最初にフィルタリングされたものの内部を検索します。以下のように、デモで見ることができますが、ラジオボタンでテーブルをフィルタリングできますが、テーブルに2番目のレベルのフィルター(JTextField)を適用する方法がわかりません。
誰かがそれを行う方法を知っていますか?
public class TwoLevelFilterTablePanel extends OeVubPanel {
private static final File DirectoryEngine = new File("C:\\Users\\Public\\Pictures\\Sample Pictures");
private JRadioButton jpg,doc,others;
private ButtonGroup radioSet;
private JTextField txtFilter;
private JTable glazedTable;
private BasicEventList<MyCode> eventList;
private JPanel filterPanel,radioSetPanel;
public TwoLevelFilterTablePanel(BasicEventList<MyCode> eventList) {
this.eventList=eventList;
createComponents();
layoutComponents();
}
public void createComponents() {
jpg = new JRadioButton("jpg");
doc= new JRadioButton("doc");
others= new JRadioButton("other");
radioSet = new ButtonGroup();
radioSet.add(jpg);
radioSet.add(doc);
radioSet.add(others);
txtFilter = new JTextField();
radioSetPanel = new JPanel();
radioSetPanel.setLayout(new BoxLayout(radioSetPanel, BoxLayout.X_AXIS));
radioSetPanel.add(jpg);
radioSetPanel.add(doc);
radioSetPanel.add(others);
filterPanel=new JPanel();
filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.Y_AXIS));
filterPanel.add(radioSetPanel);
filterPanel.add(txtFilter);
final BarcodeMatcherEditor barcodeMatcherEditor = new BarcodeMatcherEditor(jpg,doc,others);
final FilterList filteredRadioSet = new FilterList(eventList, barcodeMatcherEditor);
// build a JTable
String[] propertyNames = new String[] {"name", "size","date"};
String[] columnLabels = new String[] {"Name", "Size","Date"};
TableFormat tf = GlazedLists.tableFormat(MyCode.class, propertyNames, columnLabels);
glazedTable = new JTable(new EventTableModel(filteredRadioSet, tf));
}
public void layoutComponents() {
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
add(filterPanel);
add(new WebScrollPane(glazedTable));
}
public static void main(String[] args) {
BasicEventList<MyCode> eventList = new BasicEventList<MyCode>();
for(File file : DirectoryEngine.listFiles()){
eventList.add(new MyCode(file.getName(),file.length(),new Date(file.lastModified())));
}
TwoLevelFilterTablePanel demo = new TwoLevelFilterTablePanel(eventList );
JFrame frame = new JFrame();
Container cp = frame.getContentPane();
cp.add(demo);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setLocation(500, 500);
frame.setVisible(true);
}
}
MatcherEditorクラス:
public class BarcodeMatcherEditor extends AbstractMatcherEditor implements ActionListener {
private JRadioButton jpg,doc,others;
public BarcodeMatcherEditor(JRadioButton jpg, JRadioButton doc, JRadioButton others) {
this.jpg = jpg;
this.doc=doc;
this.others =others;
this.jpg.addActionListener(this);
this.doc.addActionListener(this);
this.others.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
final String filter = ((JRadioButton)e.getSource()).getText();
if (filter == null)
this.fireMatchAll();
else
this.fireChanged(new BarcodeFilterMatcher(filter));
}
private static class BarcodeFilterMatcher implements Matcher {
private final String filter;
public BarcodeFilterMatcher(String filter) {
this.filter = filter;
}
public boolean matches(Object item) {
final MyCode code = (MyCode) item;
return return filter.equals("other") || code.getName().endsWith(this.filter);
}
}
}