JMenu: во время запуска события из Jmenu для открытия диалогового окна (подтвердить) Joption yes / No option щелкните дважды, чтобы работать

Я пишу код в JMenu (Выход), когда нажимаю на него, он открывает окно подтверждения JOption Pane с опцией «да / нет», но он не получает фокус в первый раз, когда появляется всплывающая кнопка «да / нет».

После копания я понял, что опция Jmenu (Выход) не потеряла фокус, когда она генерирует всплывающее окно после однократного нажатия на любую кнопку, она получает фокус в следующий раз, запуская функцию, поэтому, как я могу справиться с ситуацией.

JMenu menu5 = new JMenu("Exit");
        menu5.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                requestFocus();
                callpopUp();
            }

            private void callpopUp() {
                int  choice=JOptionPane.YES_OPTION;
                choice = JOptionPane.showConfirmDialog(null, "Are you sure to Exit Application",
                       "Confirmation", JOptionPane.YES_NO_OPTION);


               if (choice == JOptionPane.YES_OPTION) {
                System.out.println("Exit Button Clicked.");
                   System.exit(0);
               }
            }
        });

person Mohasin Mujawar    schedule 25.02.2016    source источник
comment
Вопрос в том, почему вы используете JMenu для этой цели?   -  person MadProgrammer    schedule 25.02.2016
comment
@MadProgrammer: На самом деле у меня есть панель меню с меню «Выход», и когда я нажимаю на нее. OptionPane с окном подтверждения, открытым с помощью кнопки YES/NO.   -  person Mohasin Mujawar    schedule 25.02.2016
comment
Да, но JMenu не должен работать так, он должен быть контейнером для JMenuItem, в котором один из них должен быть вашим пунктом меню выхода. Ваш подход нелогичен и может сбить с толку пользователей.   -  person MadProgrammer    schedule 25.02.2016
comment
@MadProgrammer: Хорошо, понял, я соответствующим образом изменил сценарий.   -  person Mohasin Mujawar    schedule 25.02.2016


Ответы (1)


JMenu не предназначен для этой цели, вы должны использовать JMenuItem

Начните с изучения Как использовать меню и Как написать прослушиватель действий, чтобы узнать больше.

Что-то вроде...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    private JFrame frame;

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JMenuBar mb = new JMenuBar();
                JMenu file = new JMenu("File");
                JMenuItem exit = new JMenuItem("Exit");
                exit.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        performClose();
                    }
                });

                file.add(exit);
                mb.add(file);

                frame = new JFrame("Testing");
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        performClose();
                    }

                });
                frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                frame.setJMenuBar(mb);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected void performClose() {
        int choice = JOptionPane.YES_OPTION;
        choice = JOptionPane.showConfirmDialog(null, "Are you sure to Exit Application",
                        "Confirmation", JOptionPane.YES_NO_OPTION);

        if (choice == JOptionPane.YES_OPTION) {
            System.out.println("Exit Button Clicked.");
            frame.setVisible(false);
            frame.dispose();
        }
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

Это позволит вам использовать пункт меню File->Exit или просто закрыть окно с помощью кнопки [X], и оно выполнит ту же операцию, проверяя, хочет ли пользователь выйти.

person MadProgrammer    schedule 25.02.2016
comment
Событие прослушивателя действий не запускается с помощью JMenu - person Mohasin Mujawar; 25.02.2016
comment
@MohasinMujawar Так и есть, так они работают - person MadProgrammer; 25.02.2016
comment
Если я заменю прослушиватель мыши на прослушиватель действий, то как я могу связать его напрямую с JMenu, а не с каким-либо пунктом меню. я пробовал в приведенных выше фрагментах заменить код на Action Listener, это не работает для меня - person Mohasin Mujawar; 25.02.2016
comment
Нет, извините, вы говорите о JMenu, мой плохой, тогда действительно вопрос, почему вы используете JMenu для этой цели? - person MadProgrammer; 25.02.2016
comment
Хорошо, понял, я знаю способ SubMenu/MenuItem сделать это, но я просто думаю, что это может произойти и таким образом. - person Mohasin Mujawar; 25.02.2016