редактируемый JComboBox - PullRequest
       2

редактируемый JComboBox

8 голосов
/ 18 июня 2011

У меня есть редактируемый 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);
    }
}

к сожалению, когда я нажимаю ввод, два значения были вставлены вместо одного.

Почему?

1 Ответ

16 голосов
/ 18 июня 2011

Из API для JComboBox:

ActionListener получит ActionEvent, когда будет сделан выбор. Если поле со списком является редактируемым, тогда ActionEvent будет запущен, когда редактирование остановлено.

Таким образом, ваш ActionListener вызывается два раза.

Чтобы добавить элемент в JComboBox только после редактирования, вы можете проверить правильность ActionCommand, например:

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

edit (-> поток рассылки событий)

Как уже упоминалось trashgod , вы также должны создавать и показывать свой фрейм только в потоке отправки событий:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Program().setVisible(true); 
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...