2009/01/23

create Auto Suggest JComboBox





Code

class ComboKeyHandler extends KeyAdapter{
  private final JComboBox comboBox;
  private final Vector list = new Vector();
  public ComboKeyHandler(JComboBox combo) {
    this.comboBox = combo;
    for(int i=0;i< comboBox.getModel().getSize();i++) {
      list.addElement((String)comboBox.getItemAt(i));
    }
  }
  private boolean shouldHide = false;
  @Override public void keyTyped(final KeyEvent e) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        String text = ((JTextField)e.getSource()).getText();
        if(text.length()==0) {
          setSuggestionModel(comboBox, new DefaultComboBoxModel(list), "");
          comboBox.hidePopup();
        }else{
          ComboBoxModel m = getSuggestedModel(list, text);
          if(m.getSize()==0 || shouldHide) {
            comboBox.hidePopup();
          }else{
            setSuggestionModel(comboBox, m, text);
            comboBox.showPopup();
          }
        }
      }
    });
  }
  @Override public void keyPressed(KeyEvent e) {
    JTextField textField = (JTextField)e.getSource();
    String text = textField.getText();
    shouldHide = false;
    switch(e.getKeyCode()) {
      case KeyEvent.VK_RIGHT:
        for(String s: list) {
          if(s.startsWith(text)) {
            textField.setText(s);
            return;
          }
        }
        break;
      case KeyEvent.VK_ENTER:
        if(!list.contains(text)) {
          list.addElement(text);
          Collections.sort(list);
          setSuggestionModel(comboBox, getSuggestedModel(list, text), text);
        }
        shouldHide = true;
        break;
      case KeyEvent.VK_ESCAPE:
        shouldHide = true;
        break;
    }
  }
  private static void setSuggestionModel(
      JComboBox comboBox, ComboBoxModel mdl, String str) {
    comboBox.setModel(mdl);
    comboBox.setSelectedIndex(-1);
    ((JTextField)comboBox.getEditor().getEditorComponent()).setText(str);
  }
  private static ComboBoxModel getSuggestedModel(
      Vector list, String text) {
    DefaultComboBoxModel m = new DefaultComboBoxModel();
    for(String s: list) {
      if(s.startsWith(text)) m.addElement(s);
    }
    return m;
  }
}


References

2 comments:

2nyo said...

Tnx for the code Mr....

TERAI Atsuhiro said...

My pleasure :)