JMenu: время запуска события из Jmenu для открытого диалога (Подтверждение). Joption yes/No option, нажмите дважды, чтобы работать
Я пишу код в JMenu(Exit), когда нажимаю на него, он открывает окно подтверждения JOption Pane с опцией yes/NO, но он не фокусируется в первый раз, когда на всплывающую кнопку yes/no нужно дважды нажать для работы.
После копания я понимаю, что опция Jmenu (Exit) не потеряла фокус, когда она генерирует всплывающее окно после нажатия один раз на любую кнопку, которая получила фокус в следующий раз, так как я могу справиться с ситуацией.
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);
}
}
});
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], и он выполнит ту же операцию, проверяя, хочет ли пользователь выйти