Bem Pessoal to construindo um sistema em java. Eu gostaria de saber como faco para fazer uma pesquisa num test field. Ele deve funcionar do seguinte jeito.
Logo que o usuario comeca a digitar ele ja ta procurando sem ter de ter um botao pesquisar propriamente dito.
Pesquisa instantania no JTextField
P
4 Respostas
C
Use o evento key pressed no text field.
Bem Pessoal to construindo um sistema em java. Eu gostaria de saber como faco para fazer uma pesquisa num test field. Ele deve funcionar do seguinte jeito.
Logo que o usuario comeca a digitar ele ja ta procurando sem ter de ter um botao pesquisar propriamente dito.
Isso não é trivial de fazer. Procure pelo AutoCompleteDecorator do pacote Swingx.
Geralmente não fazemos esse tipo de tratamento pelo evento, como o chimufox indicou também.
O ideal é tratar pelo Document, como o Decorator que indiquei faz.
Para o Autocomplete com o JComboBox utilizo essa classe:
Como usar? Fácil!
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.Collator;
import java.util.Locale;
import javax.swing.*;
import javax.swing.text.*;
public class AutoComplete extends PlainDocument {
private static final long serialVersionUID = 5157735565710292356L;
JComboBox comboBox;
ComboBoxModel model;
JTextComponent editor;
// flag to indicate if setSelectedItem has been called
// subsequent calls to remove/insertString should be ignored
boolean selecting=false;
boolean hidePopupOnFocusLoss;
boolean hitBackspace=false;
boolean hitBackspaceOnSelection;
KeyListener editorKeyListener;
FocusListener editorFocusListener;
public AutoComplete(final JComboBox comboBox) {
this.comboBox = comboBox;
model = comboBox.getModel();
comboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!selecting) highlightCompletedText(0);
}
});
comboBox.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
if (e.getPropertyName().equals("editor")) configureEditor((ComboBoxEditor) e.getNewValue());
if (e.getPropertyName().equals("model")) model = (ComboBoxModel) e.getNewValue();
}
});
editorKeyListener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (comboBox.isDisplayable()) comboBox.setPopupVisible(true);
hitBackspace=false;
// switch (e.getKeyCode()) {
// // determine if the pressed key is backspace (needed by the remove method)
// case KeyEvent.VK_BACK_SPACE : hitBackspace=true;
// hitBackspaceOnSelection=editor.getSelectionStart()!=editor.getSelectionEnd();
// break;
// // ignore delete key
//// case KeyEvent.VK_DELETE : e.consume();
//// comboBox.getToolkit().beep();
//// break;
// }
}
};
// Bug 5100422 on Java 1.5: Editable JComboBox won't hide popup when tabbing out
hidePopupOnFocusLoss=System.getProperty("java.version").startsWith("1.5");
// Highlight whole text when gaining focus
editorFocusListener = new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
highlightCompletedText(0);
}
@Override
public void focusLost(FocusEvent e) {
// Workaround for Bug 5100422 - Hide Popup on focus loss
if (hidePopupOnFocusLoss) comboBox.setPopupVisible(false);
}
};
configureEditor(comboBox.getEditor());
// Handle initially selected object
Object selected = comboBox.getSelectedItem();
if (selected!=null) setText(selected.toString());
highlightCompletedText(0);
}
public static void enable(JComboBox comboBox) {
// has to be editable
comboBox.setEditable(true);
// change the editor's document
new AutoComplete(comboBox);
}
void configureEditor(ComboBoxEditor newEditor) {
if (editor != null) {
editor.removeKeyListener(editorKeyListener);
editor.removeFocusListener(editorFocusListener);
}
if (newEditor != null) {
editor = (JTextComponent) newEditor.getEditorComponent();
editor.addKeyListener(editorKeyListener);
editor.addFocusListener(editorFocusListener);
editor.setDocument(this);
}
}
@Override
public void remove(int offs, int len) throws BadLocationException {
// return immediately when selecting an item
if (selecting) return;
if (hitBackspace) {
// user hit backspace => move the selection backwards
// old item keeps being selected
if (offs>0) {
if (hitBackspaceOnSelection) offs--;
} else {
// User hit backspace with the cursor positioned on the start => beep
comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
}
highlightCompletedText(offs);
} else {
super.remove(offs, len);
}
}
@Override
public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
// return immediately when selecting an item
if (selecting) return;
// insert the string into the document
super.insertString(offs, str, a);
// lookup and select a matching item
Object item = lookupItem(getText(0, getLength()));
if (item != null) {
setSelectedItem(item);
} else {
// keep old item selected if there is no match
item = comboBox.getSelectedItem();
// imitate no insert (later on offs will be incremented by str.length(): selection won't move forward)
offs = offs-str.length();
// provide feedback to the user that his input has been received but can not be accepted
comboBox.getToolkit().beep(); // when available use: UIManager.getLookAndFeel().provideErrorFeedback(comboBox);
}
if(item != null)
setText(item.toString());
else
setText("");
// select the completed part
highlightCompletedText(offs+str.length());
}
private void setText(String text) {
try {
// remove all text and insert the completed string
super.remove(0, getLength());
super.insertString(0, text, null);
} catch (BadLocationException e) {
throw new RuntimeException(e.toString());
}
}
private void highlightCompletedText(int start) {
editor.setCaretPosition(getLength());
editor.moveCaretPosition(start);
}
private void setSelectedItem(Object item) {
selecting = true;
model.setSelectedItem(item);
selecting = false;
}
private Object lookupItem(String pattern) {
Object selectedItem = model.getSelectedItem();
// only search for a different item if the currently selected does not match
if (selectedItem != null && startsWithIgnoreAccentsAndCase(selectedItem.toString(), pattern)) {
return selectedItem;
} else {
// iterate over all items
for (int i=0, n=model.getSize(); i < n; i++) {
Object currentItem = model.getElementAt(i);
// current item starts with the pattern?
if (currentItem != null && startsWithIgnoreAccentsAndCase(currentItem.toString(), pattern)) {
return currentItem;
}
}
}
// no item starts with the pattern => return null
return null;
}
private static Collator collator = null;
private static Collator getCollator() {
if (collator == null) {
collator = Collator.getInstance (new Locale ("pt", "BR"));
collator.setStrength(Collator.PRIMARY);
}
return collator;
}
public static boolean startsWithIgnoreAccentsAndCase(String source,String target) {
if (target.length() > source.length())
return false;
return getCollator().compare(source.substring(0, target.length()),target) == 0;
}
}
AutoComplete.enable(suaComboBox);
Talvez sirva com o JTextField :)
P
ups nao existe um link especifico que da para eu estudar esse problema.
Criado 16 de outubro de 2011
Ultima resposta 16 de out. de 2011
Respostas 4
Participantes 4