Pesquisa instantania no JTextField

4 respostas
P

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.

4 Respostas

C

Use o evento key pressed no text field.

ViniGodoy

psp-player:
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.

adrielcafe
Para o Autocomplete com o JComboBox utilizo essa classe:
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;  
	}  
}
Como usar? Fácil!
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