Quick Search für JTable: Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
 
(5 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
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.
+
Die [[Methode]] "'''setQuickSearch(final JTable table)'''" installiert eine "Quick Search" Funktion für eine Tabelle ({{JAPI|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.
 +
 
 +
Die folgende Zeile installiert den "Quick Search" für eine Tabelle:
 +
 
 +
<syntaxhighlight lang="java">
 +
TableSupport.setQuickSearch(table);
 +
</syntaxhighlight>
 +
 
 +
[[Datei:QuickSearch.jpg]]
  
 
ANMERKUNG:
 
ANMERKUNG:
 
Mit der folgenden Property kann man den Quick Search auch für editierbare Zellen implementieren:
 
Mit der folgenden Property kann man den Quick Search auch für editierbare Zellen implementieren:
  
table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
+
<syntaxhighlight lang="java">table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);</syntaxhighlight>
<code=java>
+
 
public static void setQuickSearch(final JTable table) {
+
<syntaxhighlight lang="java">
    final JTextField searchField = new JTextField();
+
import java.awt.*;
    class Search {
+
import java.awt.event.*;
        void search() {
+
import javax.swing.*;
            table.clearSelection();
+
import javax.swing.event.*;
            String text = searchField.getText();
+
 
            if (text.length() == 0) {
+
public class TableSupport {
                return ;
+
 
            }
+
    public static void setQuickSearch(final JTable table) {
            for (int row = 0; row < table.getRowCount(); row++) {
+
//    table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
                Object val = table.getValueAt(row, 0);
+
        final JTextField searchField = new JTextField();
                String value = val != null ? val.toString() : "";
+
        class Search {
                if (value.toLowerCase().startsWith(text.toLowerCase())) {
+
 
                    table.changeSelection(row, 0, false, false);
+
            void search() {
                    break;
+
                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() {
    table.addKeyListener(new KeyAdapter() {
+
 
        @Override
+
            @Override
        public void keyPressed(final KeyEvent evt) {
+
            public void keyPressed(final KeyEvent evt) {
            char ch = evt.getKeyChar();
+
                char ch = evt.getKeyChar();
            if(!Character.isLetterOrDigit(ch)){
+
                if (!Character.isLetterOrDigit(ch)) {
                return ;
+
                     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) {
+
                 int selectedRow = table.getSelectedRow();
                    s.search();
+
                int selectedColumn = table.getSelectedColumn();
 +
                Object clientProperty = table.getClientProperty("JTable.autoStartsEdit");
 +
                if ((clientProperty == null || (Boolean) clientProperty)
 +
                        && selectedRow >= 0 && selectedColumn >= 0
 +
                        && table.isCellEditable(table.getSelectedRow(), table.getSelectedColumn())) {
 +
                    return;
 
                 }
 
                 }
                 public void changedUpdate(final DocumentEvent e) {
+
                 searchField.setText(String.valueOf(ch));
                    s.search();
+
                final Search s = new Search();
                }
+
                s.search();
            });
+
                final JDialog d = new JDialog();
            searchField.addFocusListener(new FocusListener() {
+
                d.setUndecorated(true);
                @Override
+
                d.setSize(150, 20);
                public void focusGained(final FocusEvent e) {
+
                d.setLocation(table.getTableHeader().getLocationOnScreen());
                }
+
                final JLabel lb = new JLabel("Quick Search: ");
                @Override
+
                d.add(lb, BorderLayout.LINE_START);
                public void focusLost(final FocusEvent e) {
+
                d.add(searchField);
                    d.dispose();
+
                d.setVisible(true);
                }
+
                searchField.getDocument().addDocumentListener(new DocumentListener() {
            });
+
 
            Action exit = new AbstractAction() {
+
                    @Override
                @Override
+
                    public void insertUpdate(final DocumentEvent e) {
                public void actionPerformed(final ActionEvent e) {
+
                        s.search();
                    d.dispose();
+
                    }
                }
+
 
            };
+
                    @Override
            searchField.setAction(exit);
+
                    public void removeUpdate(final DocumentEvent e) {
            searchField.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
+
                        s.search();
                    KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "exit");
+
                    }
            searchField.getActionMap().put("exit", exit);
+
 
         }
+
                    @Override
     });
+
                    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);
 +
            }
 +
         });
 +
     }
 +
 
 +
    private TableSupport() {
 +
    }
 
}
 
}
</code=java>
+
</syntaxhighlight>
[[Kategorie:Java]]
+
 
 
[[Kategorie:Swing]]
 
[[Kategorie:Swing]]
 
[[Kategorie:Java-Codeschnipsel]]
 
[[Kategorie:Java-Codeschnipsel]]
 +
[[Kategorie:JTable]]

Aktuelle Version vom 2. April 2018, 16:27 Uhr

Die Methode "setQuickSearch(final JTable table)" 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.

Die folgende Zeile installiert den "Quick Search" für eine Tabelle:

TableSupport.setQuickSearch(table);

QuickSearch.jpg

ANMERKUNG: Mit der folgenden Property kann man den Quick Search auch für editierbare Zellen implementieren:

table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class TableSupport {

    public static void setQuickSearch(final JTable table) {
//    table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
        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();
                Object clientProperty = table.getClientProperty("JTable.autoStartsEdit");
                if ((clientProperty == null || (Boolean) clientProperty)
                        && 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() {

                    @Override
                    public void insertUpdate(final DocumentEvent e) {
                        s.search();
                    }

                    @Override
                    public void removeUpdate(final DocumentEvent e) {
                        s.search();
                    }

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

    private TableSupport() {
    }
}