我正在尝试创建一个带有MenuListener的JMenu,以便在选中时退出,但程序没有退出。
编译器未显示任何错误消息。不确定e.getsource()
是否无法正常工作或是否是其他内容。
提前谢谢。
import java.awt.*;
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
public class entree implements MenuListener{
JFrame frame;
JMenu exit,teach;
entree(){
Font font=new Font("SansSerif",Font.BOLD,22);
JFrame frame=new JFrame();
ImageIcon icon=new ImageIcon("D:\\Capture_aurora.png");
JLabel bg=new JLabel(icon);
JMenuBar mb=new JMenuBar();
JMenu teach=new JMenu("Teach");
JMenu exit =new JMenu("Exit");
teach.setFont(font);exit.setFont(font);exit.addMenuListener(this);teach.addMenuListener(this);
mb.add(teach);mb.add(Box.createHorizontalGlue());mb.add(exit);
JButton button1=new JButton("Start");
button1.setFont(font);
button1.setBounds(870,820,150,45);
frame.setJMenuBar(mb);
frame.add(button1);
frame.add(bg,BorderLayout.CENTER);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setVisible(true);
}
public static void main(String[]args) {new entree();}
public void menuSelected(MenuEvent e) {
if(e.getSource()==exit) {
System.exit(0);frame.dispose();}// Code supposed to work here, but the program won't exit
if(e.getSource()==teach) {}
}
public void menuDeselected(MenuEvent e) {
}
public void menuCanceled(MenuEvent e) {
}
}
答案 0 :(得分:2)
你正在掩盖你的变量......
public class entree implements MenuListener {
JFrame frame;
JMenu exit, teach;
entree() {
//...
JMenu teach = new JMenu("Teach");
JMenu exit = new JMenu("Exit");
您在构造函数中创建局部变量,其名称与您稍后要比较的实例字段的名称相同。这意味着,当您尝试在exit
事件处理程序中对它们进行比较时,teach
和null
实际上是menuSelected
。
一般来说,这并不是JMenu
假设工作的方式,它们并不是“可操作”的项目,它们应该是类似项目的容器(实现为{{1 }}为s)。
我会考虑使用JMenuItem
或JToolBar
与JPanel
一起添加到JButton
的{{1}}位置。从用户的角度来看,它将带来更常见和预期的用户体验 - 恕我直言