Implementar o metodo autocomplete

2 respostas
nagpaulo

peguei com um amigo um metodo de autocomplete mas nao sei como implementa-lo na JComboxField ou JTextField. Alguem pode me ajudar?

OBS.: Se alguem tiver um metodo mais fácil de filtra direto no banco de dados em um combox eu agradeço.

Segue o metodo abaixo:

  1. Na JComboxFied:
  • @author paulo
    */
    import java.awt.event.ItemEvent;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.plaf.basic.BasicComboBoxEditor;

public class Java2sAutoComboBox extends JComboBox {
private class AutoTextFieldEditor extends BasicComboBoxEditor {

private Java2sAutoTextField getAutoTextFieldEditor() {
  return (Java2sAutoTextField) editor;
}

AutoTextFieldEditor(java.util.List list) {
  editor = new Java2sAutoTextField(list, Java2sAutoComboBox.this);
}

}

public Java2sAutoComboBox(java.util.List list) {

isFired = false;

autoTextFieldEditor = new AutoTextFieldEditor(list);

setEditable(true);

setModel(new DefaultComboBoxModel(list.toArray()) {
protected void fireContentsChanged(Object obj, int i, int j) {
    if (!isFired)
      super.fireContentsChanged(obj, i, j);
  }

});
setEditor(autoTextFieldEditor);

}

public boolean isCaseSensitive() {

return autoTextFieldEditor.getAutoTextFieldEditor().isCaseSensitive();

}
public void setCaseSensitive(boolean flag) {

autoTextFieldEditor.getAutoTextFieldEditor().setCaseSensitive(flag);

}
public boolean isStrict() {

return autoTextFieldEditor.getAutoTextFieldEditor().isStrict();

}
public void setStrict(boolean flag) {

autoTextFieldEditor.getAutoTextFieldEditor().setStrict(flag);

}
public java.util.List getDataList() {

return autoTextFieldEditor.getAutoTextFieldEditor().getDataList();

}
public void setDataList(java.util.List list) {

autoTextFieldEditor.getAutoTextFieldEditor().setDataList(list);

setModel(new DefaultComboBoxModel(list.toArray()));

}
void setSelectedValue(Object obj) {

if (isFired) {

return;

} else {

isFired = true;

setSelectedItem(obj);

fireItemStateChanged(new ItemEvent(this, 701, selectedItemReminder,

1));

isFired = false;

return;

}

}
protected void fireActionEvent() {

if (!isFired)

super.fireActionEvent();

}

private AutoTextFieldEditor autoTextFieldEditor;

private boolean isFired;
}

  1. Na JTextField.
import java.util.List;

import javax.swing.JTextField;

import javax.swing.text.*;

public class Java2sAutoTextField extends JTextField {
class AutoDocument extends PlainDocument {

public void replace(int i, int j, String s, AttributeSet attributeset)
    throws BadLocationException {
  super.remove(i, j);
  insertString(i, s, attributeset);
}

public void insertString(int i, String s, AttributeSet attributeset)
    throws BadLocationException {
  if (s == null || "".equals(s))
    return;
  String s1 = getText(0, i);
  String s2 = getMatch(s1 + s);
  int j = (i + s.length()) - 1;
  if (isStrict && s2 == null) {
    s2 = getMatch(s1);
    j--;
  } else if (!isStrict && s2 == null) {
    super.insertString(i, s, attributeset);
    return;
  }
  if (autoComboBox != null && s2 != null)
    autoComboBox.setSelectedValue(s2);
  super.remove(0, getLength());
  super.insertString(0, s2, attributeset);
  setSelectionStart(j + 1);
  setSelectionEnd(getLength());
}

public void remove(int i, int j) throws BadLocationException {
  int k = getSelectionStart();
  if (k > 0)
    k--;
  String s = getMatch(getText(0, k));
  if (!isStrict && s == null) {
    super.remove(i, j);
  } else {
    super.remove(0, getLength());
    super.insertString(0, s, null);
  }
  if (autoComboBox != null && s != null)
    autoComboBox.setSelectedValue(s);
  try {
    setSelectionStart(k);
    setSelectionEnd(getLength());
  } catch (Exception exception) {
  }
}

}

public Java2sAutoTextField(List list) {

isCaseSensitive = false;

isStrict = true;

autoComboBox = null;

if (list == null) {

throw new IllegalArgumentException(values can not be null);

} else {

dataList = list;

init();

return;

}

}
Java2sAutoTextField(List list, Java2sAutoComboBox b) {

isCaseSensitive = false;

isStrict = true;

autoComboBox = null;

if (list == null) {

throw new IllegalArgumentException(values can not be null);

} else {

dataList = list;

autoComboBox = b;

init();

return;

}

}
private void init() {

setDocument(new AutoDocument());

if (isStrict && dataList.size() > 0)

setText(dataList.get(0).toString());

}
private String getMatch(String s) {

for (int i = 0; i < dataList.size(); i++) {

String s1 = dataList.get(i).toString();

if (s1 != null) {

if (!isCaseSensitive

&& s1.toLowerCase().startsWith(s.toLowerCase()))

return s1;

if (isCaseSensitive && s1.startsWith(s))

return s1;

}

}
return null;

}

public void replaceSelection(String s) {

AutoDocument _lb = (AutoDocument) getDocument();

if (_lb != null)

try {

int i = Math.min(getCaret().getDot(), getCaret().getMark());

int j = Math.max(getCaret().getDot(), getCaret().getMark());

_lb.replace(i, j - i, s, null);

} catch (Exception exception) {

}

}
public boolean isCaseSensitive() {

return isCaseSensitive;

}
public void setCaseSensitive(boolean flag) {

isCaseSensitive = flag;

}
public boolean isStrict() {

return isStrict;

}
public void setStrict(boolean flag) {

isStrict = flag;

}
public List getDataList() {

return dataList;

}
public void setDataList(List list) {

if (list == null) {

throw new IllegalArgumentException(values can not be null);

} else {

dataList = list;

return;

}

}

private List dataList;

private boolean isCaseSensitive;

private boolean isStrict;

private Java2sAutoComboBox autoComboBox;
}

Obrigado!

2 Respostas

F

você vai usar algo do tipo.

ArrayList lista = new ArrayList();
lista.add("Ana Clara");
lista.add("Ana Maria");
lista.add("João");
lista.add("Marcos");

JTextField nomes = new Java2sAutoTextField(lista);
edufera10

Eu fiz um código de alto completar uma vez mas adianto pra vc, arrebenta com o processamento pq o código ta muito imaturo foi logo no inicio da minha vida do java
se quiser eu te mando o projetinho (netbeans) como que coloca aquivo aqui nesse fórum?

Criado 12 de abril de 2010
Ultima resposta 12 de abr. de 2010
Respostas 2
Participantes 3