mouseReleased на JMenu не работает - Реализация полнофункционального ActionListener - PullRequest
0 голосов
/ 27 сентября 2019

Да, я знаю, ActionListener не работает в JMenu.Вместо этого есть MenuListener.Тем не менее, он не работает точно так же, как ActionListener для кнопки.Он запускается, когда пользователь выбирает JMenu, я хочу, чтобы он вел себя как ActionListener и был запущен, когда пользователь щелкает по нему.Вот почему я попытался добавить MouseListener к компоненту, который, кажется, работает нормально с методами mousePressed и mouseClicked.

Дело в том, что добавление действия в методе mousePressed не удобно для пользователя, поскольку у пользователя нет второго шанса избежать его нажатия.Иногда мы нажимаем кнопку и удерживаем нажатой кнопку мыши, но затем мы меняем мнение, поэтому мы вытаскиваем его из нее.Для той же самой причины mouseClicked также не подходит.

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

Поэтому решение, которому я хотел следовать, - это метод mouseReleased.По какой-то причине его вообще не увольняют (почему?).

Есть ли что-нибудь, что сделает эту работу?(или я должен пойти с неоптимальным решением mouseClicked?)

В случае, если вам интересно, почему я просто не использую JButton или JMenuItem, это потому, что мой JMenu находится внутри родительского элемента JMenu и также имеет JMenuItem s.

Причина, по которой я хотел бы достичь чего-то подобного, заключается в том, что я хочу использовать JMenu в качестве центра уведомленийследовательно его элементы добавляются / удаляются динамически.Каждое уведомление перенаправляет вас куда-то, но если вы оставите свою мышь там на секунду, произойдет JMenuItem «Игнорировать уведомление».По моему мнению, лучше иметь основной функционал с одним щелчком мыши и функцией редко встречающегося щелчка в подменю.В конце концов, скажем, в уведомлении (JMenu) есть 2 подпункта: пункты «Перенаправление» и «Игнорировать».Что если я не нажму кнопку игнорирования?

Пример:

public class JMenuAction extends JFrame implements MouseListener {
    private static final long serialVersionUID = 1L;

    public JMenuAction() {
        super("test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JMenu menu = new JMenu("menu");
        menu.addMouseListener(this);

        JMenu parent = new JMenu("parent");
        parent.add(menu);

        menu.add(new JMenuItem("something"));
        JMenuBar bar = new JMenuBar();
        bar.add(parent);
        setJMenuBar(bar);
        setSize(300, 300);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new JMenuAction().setVisible(true));
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("CLICKED");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        System.out.println("PRESSED");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.out.println("RELEASED");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

}
...