我正在尝试创建一个涉及保存和读取文件的菜单,在保存和读取文件的每个菜单中,菜单将为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
答案 0 :(得分:0)
问题似乎是您尚未初始化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);
}
答案 1 :(得分:0)
对我来说正确地在下面。您创建不必要的方法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外部访问此对象。
答案 2 :(得分:0)
也许您是在实例化对象文件MenuLuuTxt之前添加侦听器。
可以尝试:
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)”方法之前添加侦听器时,由于创建了新实例,该侦听器将丢失。