problem with autocomplete combobox

Discussion in 'Java' started by Gowri, Jun 17, 2008.

  1. Gowri

    Gowri Guest

    Hi all,

    I've no idea if this is the right way to implement an auto complete
    combobox but this one seems to work fine except for the fact that
    every first time the model's contents completely change, the text
    field and the popup are of different sizes.

    How do I fix this?
    Please find my code below:


    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusAdapter;
    import java.awt.event.FocusEvent;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Vector;

    import javax.swing.ComboBoxModel;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.WindowConstants;
    import javax.swing.plaf.basic.BasicComboPopup;
    import javax.swing.text.JTextComponent;

    import org.jdom.Element;
    import org.jdom.input.SAXBuilder;



    public class MeshNameDialog{
    private static MeshNameDialog mnd = null;
    private JComboBox comboBox = new JComboBox();
    private static ComboBoxModel model;
    private static JTextComponent editor;
    private static boolean hidePopupOnFocusLoss;

    private JButton ok = new JButton("OK");
    private JButton cancel = new JButton("Cancel");
    private GridBagLayout layoutMgr = new GridBagLayout();
    private GridBagConstraints gbc = new GridBagConstraints();
    private static JFrame frame = new JFrame();
    private JPanel buttonPanel = new JPanel();

    static Object[] names = {"looooooooooooooong string","short string",
    "crappy stringggg"};

    private MeshNameDialog() {
    frame.setSize(350, 120);

    // create and show a window containing the combo box
    frame.setLayout(layoutMgr);

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.insets = new Insets(10, 10, 5, 10);
    frame.getContentPane().add(comboBox, gbc);

    ok.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    MeshAppConfig.setMeshName((String) comboBox.getEditor()
    .getItem());
    frame.setVisible(false);
    }
    });
    buttonPanel.add(ok);

    cancel.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    frame.dispose();
    System.exit(0);
    }
    });
    buttonPanel.add(cancel);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.insets = new Insets(3, 0, 3, 0);
    frame.getContentPane().add(buttonPanel, gbc);

    Dimension screen =
    java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    int x = (screen.width - frame.getWidth()) / 3;
    int y = 2 * (screen.height - frame.getHeight()) / 5;
    frame.setLocation(x, y);
    frame.setTitle("Mesh Name Dialog");
    }

    public static MeshNameDialog getInstance() {
    if ((null == mnd))
    mnd = new MeshNameDialog();
    mnd.init();
    return mnd;
    }

    private void init() {
    if (null == names) {
    String[] tarr = { " " };
    comboBox.setModel(new DefaultComboBoxModel(tarr));
    } else {
    comboBox.setModel(new DefaultComboBoxModel(names));
    }
    model = comboBox.getModel();
    editor = (JTextComponent) comboBox.getEditor().getEditorComponent();
    comboBox.setEditable(true);
    comboBox.getEditor().setItem("");

    editor.addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
    String textFieldContents = (String) comboBox.getEditor()
    .getItem();
    if (!Character.isIdentifierIgnorable(e.getKeyChar())
    || e.getKeyCode() == KeyEvent.VK_BACK_SPACE
    || e.getKeyCode() == KeyEvent.VK_DELETE) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
    String item = (String) comboBox.getSelectedItem();
    comboBox.getEditor().setItem(item);
    comboBox.setPopupVisible(false);
    return;
    }

    if (e.getKeyCode() == KeyEvent.VK_UP
    || e.getKeyCode() == KeyEvent.VK_DOWN) {
    String item = (String) comboBox.getSelectedItem();
    comboBox.repaint();
    comboBox.getEditor().setItem(item);
    comboBox.setPopupVisible(true);
    return;
    }

    Object[] matchedStrings = getItems(textFieldContents);
    if (matchedStrings != null) {
    comboBox.setModel(new DefaultComboBoxModel(
    matchedStrings));
    comboBox.setPopupVisible(true);

    } else {
    comboBox.setModel(new DefaultComboBoxModel(names));
    comboBox.setPopupVisible(false);
    }
    }
    comboBox.getEditor().setItem(textFieldContents);
    }
    });
    // Bug 5100422 on Java 1.5: Editable JComboBox won't hide popup when
    tabbing out
    hidePopupOnFocusLoss =
    System.getProperty("java.version").startsWith(
    "1.5");
    editor.addFocusListener(new FocusAdapter() {
    public void focusGained(FocusEvent e) {

    }

    public void focusLost(FocusEvent e) {
    // Workaround for Bug 5100422 - Hide Popup on focus loss
    if (hidePopupOnFocusLoss)
    comboBox.setPopupVisible(false);
    }
    });

    frame.setVisible(true);
    }

    private static Object[] getItems(String text) {
    Vector v = new Vector();
    for (int i = 0; i < names.length; i++) {
    if (((String) names).toLowerCase()
    .startsWith(text.toLowerCase()))
    v.add(names);
    }
    if (v.size() > 0)
    return v.toArray();
    return null;
    }

    public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    MeshNameDialog.getInstance();
    }
    });
    }
    }


    I'd really appreciate all the help I can get.

    Regards,
    Gowri
     
    Gowri, Jun 17, 2008
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. RajW
    Replies:
    4
    Views:
    3,515
    PeterBrunone
    Sep 6, 2006
  2. Replies:
    0
    Views:
    406
  3. Stefan Filip

    AJAX Autocomplete Extender problem

    Stefan Filip, Nov 21, 2007, in forum: ASP .Net
    Replies:
    2
    Views:
    5,287
    yuriy.loginov
    Aug 28, 2012
  4. rasta

    databound autocomplete ComboBox

    rasta, Nov 28, 2004, in forum: ASP .Net Web Controls
    Replies:
    2
    Views:
    171
    rasta
    Nov 29, 2004
  5. Replies:
    5
    Views:
    490
    Roedy Green
    Oct 11, 2012
Loading...

Share This Page