可编辑的JComboBox

Ars*_*sen 8 java swing jcombobox

我有可编辑,JComboBox并希望从输入中添加值,当我输入内容JComboBox并按回车时我希望该文本出现在JComboBox列表中:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我按下输入时,插入了两个值而不是一个.

为什么?

veh*_*ehk 16

APIJComboBox:

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

因此,你ActionListener被召唤两次.

要仅将项目添加到JComboBox编辑时,您可以检查以下内容ActionCommand:

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("comboBoxEdited")) {
    //code
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑( - >事件派发线程)

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

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

  • +1也从[事件派发线程]开始(http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). (2认同)