可编辑的JComboBox

时间:2011-06-18 09:45:43

标签: java swing jcombobox

我有可编辑的JComboBox,并且希望在输入时为其添加值,当我在JComboBox中输入内容时按下回车我希望该文本显示在JComboBox列表中:< / p>

public class Program extends JFrame 
    implements ActionListener {
    private JComboBox box;

    public static void main(String[] args) {
        new Program().setVisible(true);
    }

    public Program() {
        super("Text DEMO");
        setSize(300, 300);
        setLayout(new FlowLayout());
        Container cont = getContentPane();
        box = new JComboBox(new String[] { "First", "Second", "..." });
        box.setEditable(true);
        box.addActionListener(this);
        cont.add(box);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        box.removeActionListener(this);
        box.insertItemAt(box.getSelectedItem(), 0);
        box.addActionListener(this);
    }
}

不幸的是,当我按下回车时,插入了两个值,而不是一个。

为什么?

1 个答案:

答案 0 :(得分:16)

来自JComboBox的{​​{3}}:

  

ActionListener将在完成选择后收到ActionEvent。如果组合框是可编辑的,则在编辑停止时将触发ActionEvent。

因此,您的ActionListener被调用两次。

要仅在编辑时将项目添加到JComboBox,您可以检查正确的ActionCommand,如下所示:

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("comboBoxEdited")) {
    //code
    }
}

编辑( - &gt;事件调度线程)

正如API已经提到的,您还应该只在事件派发线程中创建和显示您的框架:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Program().setVisible(true); 
        }
    });
}