Java Swingでtableのfilter機能を実現

4898 ワード

コードは次のとおりです.
(注記されたコードはregisterKeyboardAction()メソッドを使用しており、このメソッドは破棄されています)
package table;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.util.regex.*;

public class FilterTable {
  public static void main(String args[]) {
    Runnable runner = new Runnable() {
      public void run() {
        JFrame frame = new JFrame("Sorting JTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Object rows[][] = {
          {"AMZN", "Amazon", 41.28},
          {"EBAY", "eBay", 41.57},
          {"GOOG", "Google", 388.33},
          {"MSFT", "Microsoft", 26.56},
          {"NOK", "Nokia Corp", 17.13},
          {"ORCL", "Oracle Corp.", 12.52},
          {"SUNW", "Sun Microsystems", 3.86},
          {"TWX",  "Time Warner", 17.66},
          {"VOD",  "Vodafone Group", 26.02},
          {"YHOO", "Yahoo!", 37.69}
        };
        Object columns[] = {"Symbol", "Name", "Price"};
        TableModel model =
           new DefaultTableModel(rows, columns) {
          public Class getColumnClass(int column) {
            Class returnValue;
            if ((column >= 0) && (column < getColumnCount())) {
              returnValue = getValueAt(0, column).getClass();
            } else {
              returnValue = Object.class;
            }
            return returnValue;
          }
        };
        JTable table = new JTable(model);
        final TableRowSorter<TableModel> sorter =
                new TableRowSorter<TableModel>(model);
        table.setRowSorter(sorter);
        JScrollPane pane = new JScrollPane(table);
        frame.add(pane, BorderLayout.CENTER);
        JPanel panel = new JPanel(new BorderLayout());
        JLabel label = new JLabel("Filter");
        panel.add(label, BorderLayout.WEST);      
        	
        final JTextField filterText =
            new JTextField("SUN");
        panel.add(filterText, BorderLayout.CENTER);
        frame.add(panel, BorderLayout.NORTH);
        
//        ActionListener filterListener = new ActionListener() {  
//            public void actionPerformed(ActionEvent e) {
//                String text = filterText.getText();
//                if (text.length() == 0) {
//                  sorter.setRowFilter(null);
//                } else {
//                  try {
//                    sorter.setRowFilter(
//                        RowFilter.regexFilter(text));
//                  } catch (PatternSyntaxException pse) {
//                    System.err.println("Bad regex pattern");
//                  }
//                }
//              }
//    	}; 
    	
        JButton button = new JButton("Filter");
        //button.addActionListener(filterListener);
        Action filterAction = new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                //do nothing
                String text = filterText.getText();
                if (text.length() == 0) {
                  sorter.setRowFilter(null);
                } else {
                  try {
                    sorter.setRowFilter(
                        RowFilter.regexFilter(text));
                  } catch (PatternSyntaxException pse) {
                    System.err.println("Bad regex pattern");
                  }
                }
              }
        };
        filterText.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),
                "filterTable");
        filterText.getActionMap().put("filterTable",
        		filterAction);
        

        
//        filterText.registerKeyboardAction(filterListener,
//                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false),
//                JComponent.WHEN_FOCUSED);
//        filterText.registerKeyboardAction(filterListener,
//                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),
//                JComponent.WHEN_FOCUSED);
        
//        button.registerKeyboardAction(button.getActionForKeyStroke(KeyStroke
//                .getKeyStroke(KeyEvent.VK_SPACE, 0, false)),
//                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false),
//                JComponent.WHEN_FOCUSED);
//        button.registerKeyboardAction(button.getActionForKeyStroke(KeyStroke
//                .getKeyStroke(KeyEvent.VK_SPACE, 0, false)),
//                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),
//                JComponent.WHEN_FOCUSED);
        
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(300, 250);
        frame.setVisible(true);
      }
    };
    EventQueue.invokeLater(runner);
  }
}