Обработка actionPerformed на JComboBox только тогда, когда пользователь подтвердил выбор - PullRequest
3 голосов
/ 10 ноября 2011

Когда я регистрирую ActionListener в нередактируемом JComboBox, он запускает actionPerformed () каждый раз, когда пользователь меняет выбранный элемент с помощью клавиш со стрелками или контекстного поиска (вводя первую букву имени элемента).

Я нашел похожий вопрос здесь: Как сделать, чтобы выбранный элемент JComboBox не изменялся при прокрутке его всплывающего списка с помощью клавиатуры . Но это решение не распространяется на контекстный поиск. Он запускает actionPerformed (), когда я что-то печатаю.

Как определить, когда пользователь подтверждает выбранный пункт, используя клавишу ввода или щелчок мыши?

Ответы [ 2 ]

7 голосов
/ 10 ноября 2011

лучше было бы реализовать ItemListener (запускается дважды SELECTED и DESELECTED), чем ActionListener и KeyBindings , может быть, с таким простым примером здесь

import java.awt.*;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class PopupTest {

    public static void main(String[] args) {
        final JComboBox c = new JComboBox();
        c.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuCanceled(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }

            @Override
            public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }

            @Override
            public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                System.out.println(e.getSource());
            }
        });
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new FlowLayout());
        f.getContentPane().add(c);
        f.pack();
        f.setVisible(true);
    }

    private PopupTest() {
    }
}
3 голосов
/ 10 ноября 2011

Спасибо за ответ.Это то, что мне действительно нужно.Я также добавил actionListener для случая, когда пользователь перемещается по списку со стрелками, когда всплывающее окно невидимо:

scriptsCombobox.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        JComboBox source = (JComboBox) e.getSource();
        if(!source.isPopupVisible()){
            //update data
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...