[英]How does JMenuItem receive tasks when clicking?
我正在尝试创建一个涉及保存和读取文件的菜单,在每个保存和读取文件的菜单中,将为JMenuItem
。
我希望每个JMenuItem
在单击时都处于活动状态,我使用了与下面相同的代码,但是该程序具有以下错误。 我对按钮使用了addActionListener
命令,它们可以正常工作,当我执行JMenuItem
,出现了错误。
这是我的代码:
public void createMenu(JFrame chuongTrinh){
JMenuBar barMenu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setIcon(new ImageIcon("pic/system.png"));
barMenu.add(fileMenu);
fileMenu.addSeparator();
JMenu fileMenuLuu = new JMenu("Lưu File");
fileMenuLuu.setIcon(new ImageIcon("pic/saveFile.png"));
fileMenu.add(fileMenuLuu);
JMenuItem fileMenuLuuTxt = new JMenuItem("Text File");
fileMenuLuuTxt.setIcon(new ImageIcon("pic/txtFile.png"));
fileMenuLuu.add(fileMenuLuuTxt);
public formSinhVien(){
fileMenuLuuTxt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
这是它的错:
“线程“主”中的异常” java.lang.NullPointerException
问题似乎在于您fileMenuLuuTxt
初始化fileMenuLuuTxt
。 我猜您有一个实例变量fileMenuLuuTxt
但是没有在createMenu
方法中分配它。 因此,如下更改代码:
private JMenuItem fileMenuLuuTxt; // your instance variable
public void createMenu(JFrame chuongTrinh){
JMenuBar barMenu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setIcon(new ImageIcon("pic/system.png"));
barMenu.add(fileMenu);
fileMenu.addSeparator();
JMenu fileMenuLuu = new JMenu("Lưu File");
fileMenuLuu.setIcon(new ImageIcon("pic/saveFile.png"));
fileMenu.add(fileMenuLuu);
fileMenuLuuTxt = new JMenuItem("Text File"); // this is the change
fileMenuLuuTxt.setIcon(new ImageIcon("pic/txtFile.png"));
fileMenuLuu.add(fileMenuLuuTxt);
}
对我来说正确地在下面。 您创建不必要的方法formSinhVien
public void createMenu(JFrame chuongTrinh){
JMenuBar barMenu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setIcon(new ImageIcon("pic/system.png"));
barMenu.add(fileMenu);
fileMenu.addSeparator();
JMenu fileMenuLuu = new JMenu("Lưu File");
fileMenuLuu.setIcon(new ImageIcon("pic/saveFile.png"));
fileMenu.add(fileMenuLuu);
JMenuItem fileMenuLuuTxt = new JMenuItem("Text File");
fileMenuLuuTxt.setIcon(new ImageIcon("pic/txtFile.png"));
fileMenuLuuTxt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenuLuu.add(fileMenuLuuTxt);
}
如果您需要从此方法之外访问对象fileMenuLuuTxt
,则可以创建字段JMenuItem fileMenuLuuTxt;
在您的班级中,然后如下所示修改行fileMenuLuuTxt = new JMenuItem("Text File");
-删除方法中的JMenuItem。 这意味着您声明了类字段,然后在方法中初始化了该字段。 在您的情况下,您可以在method中声明和初始化变量,并且您无法从method外部访问此对象。
也许您在实例化对象fileMenuLuuTxt之前添加了侦听器。
可以尝试:
JMenuItem fileMenuLuTxt
(而不是在方法中)。 public void createMenu(JFrame chuongTrinh)
实例化先前的变量。 public formSinhVien()
在上一个方法之后执行。 如果您无法控制执行顺序,则解决方案可能是这样初始化全局变量: private JMenuItem fileMenuLuTxt = new JMenuItem() //Add the necessary parameters by default.
不好的事情是,当您在执行“ public void createMenu(JFrame chuongTrinh)”方法之前添加侦听器时,由于创建了新实例,该侦听器将丢失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.