单击时JMenuItem如何接收任务?

时间:2019-01-28 06:28:24

标签: java

我正在尝试创建一个涉及保存和读取文件的菜单,在保存和读取文件的每个菜单中,菜单将为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

3 个答案:

答案 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之前添加侦听器。

可以尝试:

  1. 您必须全局声明变量JMenuItem fileMenuLuTxt 类(而不是方法内)。
  2. 执行方法public void createMenu(JFrame chuongTrinh)     实例化上一个变量。
  3. 方法public formSinhVien()是在         上一个。

如果您无法控制执行顺序,则解决方案可能是初始化全局变量,如下所示:private JMenuItem fileMenuLuTxt = new JMenuItem() //Add the necessary parameters by default.

不好的事情是,当您在执行“ public void createMenu(JFrame chuongTrinh)”方法之前添加侦听器时,由于创建了新实例,该侦听器将丢失。