Java JMenu:当从JMenu为打开对话框(confirmbox)选项“是/否”触发事件时,单击两次即可工作
我在JMenu(Exit)上写代码,当我点击它时,它打开选项窗格确认消息框,带有yes/NO选项,但当它第一次弹出yes/NO按钮时,它没有得到焦点,应该点击两次才能工作 挖掘后,我意识到Jmenu(Exit)选项在点击任何按钮后生成弹出窗口时不会失去焦点,它下次获得焦点触发功能,因此我可以如何处理这种情况Java JMenu:当从JMenu为打开对话框(confirmbox)选项“是/否”触发事件时,单击两次即可工作,java,swing,jmenuitem,Java,Swing,Jmenuitem,我在JMenu(Exit)上写代码,当我点击它时,它打开选项窗格确认消息框,带有yes/NO选项,但当它第一次弹出yes/NO按钮时,它没有得到焦点,应该点击两次才能工作 挖掘后,我意识到Jmenu(Exit)选项在点击任何按钮后生成弹出窗口时不会失去焦点,它下次获得焦点触发功能,因此我可以如何处理这种情况 JMenu menu5 = new JMenu("Exit"); menu5.addMouseListener(new MouseAdapter() {
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);
}
}
});
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);
}
}
}
这将允许您使用
文件->退出
菜单选项,或通过[X]按钮简单地关闭窗口,它将执行相同的操作,检查用户是否希望退出操作侦听器事件不会触发JMenu@MohasinMujawar是的,这就是它们的工作原理如果我用动作监听器替换鼠标监听器,那么我就可以直接用JMenu绑定,而不是任何菜单项。我试过在上面的代码片段中用Action Listener替换代码它对meNo不起作用对不起,你说的是JMenu
,我的错,那么问题是,你为什么要使用JMenu
来实现这个目的?好的,我知道子菜单/MenuItem的实现方式,但我只是认为它也可能以这种方式发生。问题是,你为什么要使用JMenu
来实现这个目的?@MadProgrammer:事实上,我有一个带有菜单退出的菜单栏,只要我点击它。OptionPane带有确认框,用YES/NO按钮打开。是的,但是JMenu
不应该这样工作,它应该是JMenuItem
s的容器,其中一个应该是您的退出菜单项。你的方法是反直觉的,可能会让人困惑users@MadProgrammer:好的,我会相应地修改场景。