Quick Search für JTable: Unterschied zwischen den Versionen
Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springenK |
K |
||
Zeile 7: | Zeile 7: | ||
Die folgende Zeile installiert den "Quick Search" für eine Tabelle: | Die folgende Zeile installiert den "Quick Search" für eine Tabelle: | ||
− | < | + | <syntaxhighlight lang="java"> |
TableSupport.setQuickSearch(table); | TableSupport.setQuickSearch(table); | ||
− | </ | + | </syntaxhighlight> |
[[Datei:QuickSearch.jpg]] | [[Datei:QuickSearch.jpg]] | ||
Zeile 16: | Zeile 16: | ||
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: | ||
− | < | + | <syntaxhighlight lang="java">table.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);</syntaxhighlight> |
− | < | + | <syntaxhighlight lang="java"> |
import java.awt.*; | import java.awt.*; | ||
import java.awt.event.*; | import java.awt.event.*; | ||
Zeile 120: | Zeile 120: | ||
} | } | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
[[Kategorie:Java]] | [[Kategorie:Java]] | ||
[[Kategorie:Swing]] | [[Kategorie:Swing]] | ||
[[Kategorie:Java-Codeschnipsel]] | [[Kategorie:Java-Codeschnipsel]] | ||
[[Kategorie:JTable]] | [[Kategorie:JTable]] |
Version vom 11. März 2018, 14:38 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);
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() {
}
}