1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| 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() {
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);
}
});
} |
Partager