繁体   English   中英

单击时JMenuItem如何接收任务?

[英]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之前添加了侦听器。

可以尝试:

  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)”方法之前添加侦听器时,由于创建了新实例,该侦听器将丢失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM