Quick Search für JTable

Aus Byte-Welt Wiki
Version vom 17. Oktober 2009, 16:47 Uhr von AndreUhres (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Die folgende Methode installiert eine "Quick Search" Funktion für eine Tabelle (JTable). Das Beispiel implementiert die Suche auf der ersten Spalte. Es wird ange…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springenZur Suche springen

Die folgende Methode installiert eine "Quick Search" Funktion für eine Tabelle (JTable). Das Beispiel implementiert die Suche auf der ersten Spalte. Es wird angenommen, dass sie einfachen Text enthält und nicht editierbar ist. Die Suche sollte automatisch starten, wenn der Fokus auf einer nicht editierbaren Zelle ist und man den Anfang des gesuchten Textes auf der Tastatur erfasst: <code=java> public static void setQuickSearch(final JTable table) {

   final JTextField searchField = new JTextField();
   class Search {
       void search() {
           table.clearSelection();
           String text = searchField.getText();
           if (text.length() == 0) {
               return ;
           }
           for (int row = 0; row < table.getRowCount(); row++) {
               Object val = table.getValueAt(row, 0);
               String value = val != null ? val.toString() : "";
               if (value.toLowerCase().startsWith(text.toLowerCase())) {
                   table.changeSelection(row, 0, false, false);
                   break;
               }
           }
       }
   }
   table.addKeyListener(new KeyAdapter() {
       @Override
       public void keyPressed(final KeyEvent evt) {
           char ch = evt.getKeyChar();
           if(!Character.isLetterOrDigit(ch)){
               return ;
           }
           int selectedRow = table.getSelectedRow();
           int selectedColumn = table.getSelectedColumn();
           if (selectedRow >= 0 && selectedColumn >= 0 &&
                   table.isCellEditable(table.getSelectedRow(), table.getSelectedColumn())){
               return ;
           }
           searchField.setText(String.valueOf(ch));
           final Search s = new Search();
           s.search();
           final JDialog d = new JDialog();
           d.setUndecorated(true);
           d.setSize(150, 20);
           d.setLocation(table.getTableHeader().getLocationOnScreen());
           final JLabel lb = new JLabel("Quick Search: ");
           d.add(lb, BorderLayout.LINE_START);
           d.add(searchField);
           d.setVisible(true);
           searchField.getDocument().addDocumentListener(new DocumentListener() {
               public void insertUpdate(final DocumentEvent e) {
                   s.search();
               }
               public void removeUpdate(final DocumentEvent e) {
                   s.search();
               }
               public void changedUpdate(final DocumentEvent e) {
                   s.search();
               }
           });
           searchField.addFocusListener(new FocusListener() {
               @Override
               public void focusGained(final FocusEvent e) {
               }
               @Override
               public void focusLost(final FocusEvent e) {
                   d.dispose();
               }
           });
           Action exit = new AbstractAction() {
               @Override
               public void actionPerformed(final ActionEvent e) {
                   d.dispose();
               }
           };
           searchField.setAction(exit);
           searchField.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                   KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "exit");
           searchField.getActionMap().put("exit", exit);
       }
   });

} </code=java>