Java JTextField create auto-complete text field

Description

Java JTextField create auto-complete text field

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Arrays;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Main extends JFrame {
  public Main() {
    super("JButton");

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new FlowLayout());
    JLabel nameLabel = new JLabel("Value:");

    JTextField text = new JTextField("CSS");
    List<String> langList = Arrays.asList("CSS","HTML","Java","Javascript","SQL","C","C++");
    /*from  w w  w .ja  va  2 s  .  c  om*/
    Util.setupAutoComplete(text, langList) ;
    getContentPane().add(nameLabel);
    getContentPane().add(text);

  }

  public static void main(String[] args) {
    Main frame = new Main();
    frame.pack();
    frame.setVisible(true);
  }
}

class Util {
  public static void setupAutoComplete(final JTextField txtInput, List<String> items) {
    final DefaultComboBoxModel model = new DefaultComboBoxModel();
    final JComboBox cbInput = new JComboBox(model) {
      public Dimension getPreferredSize() {
        return new Dimension(super.getPreferredSize().width, 0);
      }
    };
    setAdjusting(cbInput, false);
    if (items != null) {
      for (String item : items) {
        model.addElement(item);
      }
    }

    cbInput.setSelectedItem(null);
    cbInput.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        if (!isAdjusting(cbInput)) {
          if (cbInput.getSelectedItem() != null) {
            txtInput.setText(cbInput.getSelectedItem().toString());
          }
        }
      }
    });

    txtInput.addKeyListener(new KeyAdapter() {

      @Override
      public void keyPressed(KeyEvent e) {
        setAdjusting(cbInput, true);
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
          if (cbInput.isPopupVisible()) {
            e.setKeyCode(KeyEvent.VK_ENTER);
          }
        }
        if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_UP
            || e.getKeyCode() == KeyEvent.VK_DOWN) {
          e.setSource(cbInput);
          cbInput.dispatchEvent(e);
          if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            txtInput.setText(cbInput.getSelectedItem().toString());
            cbInput.setPopupVisible(false);
          }
        }
        if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
          cbInput.setPopupVisible(false);
        }
        setAdjusting(cbInput, false);
      }
    });
    txtInput.getDocument().addDocumentListener(new DocumentListener() {
      public void insertUpdate(DocumentEvent e) {
        updateList();
      }

      public void removeUpdate(DocumentEvent e) {
        updateList();
      }

      public void changedUpdate(DocumentEvent e) {
        updateList();
      }

      private void updateList() {
        setAdjusting(cbInput, true);
        model.removeAllElements();
        String input = txtInput.getText();
        if (!input.isEmpty()) {
          for (String item : items) {
            if (item.toLowerCase().startsWith(input.toLowerCase())) {
              model.addElement(item);
            }
          }
        }
        cbInput.setPopupVisible(model.getSize() > 0);
        setAdjusting(cbInput, false);
      }
    });
    txtInput.setLayout(new BorderLayout());
    txtInput.add(cbInput, BorderLayout.SOUTH);
  }

  private static void setAdjusting(JComboBox cbInput, boolean adjusting) {
    cbInput.putClientProperty("is_adjusting", adjusting);
  }

  private static boolean isAdjusting(JComboBox cbInput) {
    if (cbInput.getClientProperty("is_adjusting") instanceof Boolean) {
      return (Boolean) cbInput.getClientProperty("is_adjusting");
    }
    return false;
  }
}



PreviousNext

Related