我有可编辑的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);
}
}
不幸的是,当我按下回车时,插入了两个值,而不是一个。
为什么?
答案 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);
}
});
}