Да, я знаю, 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) {
}
}