简体   繁体   English

菜单项不会响应点击

[英]Menu Item won't respond to click

the "Exit" MenuItem responds perfectly but the "Change Name" is a problem.. i can't figure out whats wrong, Can Someone help please... I know the userName.setUserName is working ok.. cuz i'm using it in another class and it works perfectly. “退出”菜单项响应完美,但是“更改名称”是一个问题..我无法弄清楚出了什么问题,请有人帮忙...我知道userName.setUserName正常运行。它在另一个类中,并且效果很好。 just can't figure out whats wrong 只是不知道怎么了

Here's the code 这是代码

public class MenuBar extends JMenuBar{

    // variable declaration
    private JMenu menu;
    private JMenuItem menuItem;
    private JMenuItem changed_Name;
    private JMenuItem exit;



    public MenuBar(){

        init();

    }


    private void init(){

       menu = new JMenu("File");
       add(menu);

       changed_Name = new JMenuItem("Change Name");
       changed_Name.setMnemonic(KeyEvent.VK_C);
       changed_Name.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
       changed_Name.getAccessibleContext().setAccessibleDescription("This Will Allow a Name Change");
       menu.add(changed_Name);

    exit = new JMenuItem("Exit");
    menu.add(exit);


    menu = new JMenu("Help");
    add(menu);

    menuItem = new JMenuItem("Help & Docs");
    //menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED) );
    menuItem.getAccessibleContext().setAccessibleDescription("Get Help or View Software documents");
    menu.add(menuItem);

    menuItem = new JMenuItem("About");
    menu.add(menuItem);

    MenuHandler menuHandler = new MenuHandler();
    menuItem.addActionListener(menuHandler);
    exit.addActionListener(menuHandler);


}


private class MenuHandler implements ActionListener{

    AgentName userName = new AgentName();

    @Override
    public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {

            Object menuItem_Command = e.getActionCommand();

            if(menuItem_Command.equals("Change Name")){
                userName.setUserName(userName.getUserName());
            }
            else if(menuItem_Command.equals("Exit")){
                System.exit(0);
            }

    }

}
}

You never register the MenuHandler with the changed_name JMenuItem ... 您永远都不会使用changed_name JMenuItem注册MenuHandler

Also, beware, you are reassigning menuItem multiple times, meaning hat only About is been registered with the MenuHandler 另外,请注意,您要多次重新分配menuItem ,这意味着只有About才向MenuHandler注册。

For example... 例如...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setJMenuBar(new MenuBar());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MenuBar extends JMenuBar {

        // variable declaration
        private JMenu menu;
        private JMenuItem menuItem;
        private JMenuItem changed_Name;
        private JMenuItem exit;

        public MenuBar() {

            init();

        }

        private void init() {

            menu = new JMenu("File");
            add(menu);

            MenuHandler menuHandler = new MenuHandler();

            changed_Name = new JMenuItem("Change Name");
            changed_Name.setMnemonic(KeyEvent.VK_C);
            changed_Name.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
            changed_Name.getAccessibleContext().setAccessibleDescription("This Will Allow a Name Change");
            changed_Name.addActionListener(menuHandler);
            menu.add(changed_Name);

            exit = new JMenuItem("Exit");
            menu.add(exit);

            menu = new JMenu("Help");
            add(menu);

            menuItem = new JMenuItem("Help & Docs");
            //menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED) );
            menuItem.getAccessibleContext().setAccessibleDescription("Get Help or View Software documents");
            menuItem.addActionListener(menuHandler);
            menu.add(menuItem);

            menuItem = new JMenuItem("About");
            menuItem.addActionListener(menuHandler);
            menu.add(menuItem);

            exit.addActionListener(menuHandler);

        }

        private class MenuHandler implements ActionListener {

//          AgentName userName = new AgentName();

            @Override
            public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {

                Object menuItem_Command = e.getActionCommand();

                System.out.println(menuItem_Command);

                if (menuItem_Command.equals("Change Name")) {
                    System.out.println("Yippe");
//                  userName.setUserName(userName.getUserName());
                } else if (menuItem_Command.equals("Exit")) {
                    System.exit(0);
                }

            }

        }
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }
}

Generally speaking, you should really need to extend JMenuBar , but simply create an instance and add the menus you need to it 一般来说,您确实需要扩展JMenuBar ,但只需创建一个实例并将所需菜单添加到该实例即可。

You may also consider having a look at How to Use Actions , which are self contained units, which contain their own configuration and action logic 您也可以考虑看看如何使用操作 ,它们是独立的单元,包含其自己的配置和操作逻辑

For example... 例如...

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import static javax.swing.Action.ACCELERATOR_KEY;
import static javax.swing.Action.MNEMONIC_KEY;
import static javax.swing.Action.NAME;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setJMenuBar(new MenuBar());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ChangeNameAction extends AbstractAction {

        public ChangeNameAction() {
            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_1, KeyEvent.ALT_MASK));
            putValue(MNEMONIC_KEY, KeyEvent.VK_C);
            putValue(NAME, "Change Name");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Change name");
        }
    }

    public class ExitAction extends AbstractAction {

        public ExitAction() {
            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_4, KeyEvent.ALT_MASK));
            putValue(MNEMONIC_KEY, KeyEvent.VK_X);
            putValue(NAME, "Exit");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }

    public class HelpAction extends AbstractAction {

        public HelpAction() {
            putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
            putValue(MNEMONIC_KEY, KeyEvent.VK_H);
            putValue(NAME, "Help & Docs");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Help and docs");
        }
    }

    public class AboutAction extends AbstractAction {

        public AboutAction() {
            putValue(NAME, "About");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("About");
        }
    }

    public class MenuBar extends JMenuBar {

        // variable declaration
        private JMenu menu;
        private JMenuItem menuItem;
        private JMenuItem changed_Name;
        private JMenuItem exit;

        public MenuBar() {

            init();

        }

        private void init() {

            menu = new JMenu("File");
            add(menu);

            menu.add(new ChangeNameAction());
            menu.add(new ExitAction());

            menu = new JMenu("Help");
            add(menu);

            menu.add(new HelpAction());
            menu.add(new AboutAction());

        }

        private class MenuHandler implements ActionListener {

    //          AgentName userName = new AgentName();
            @Override
            public void actionPerformed(ActionEvent e) throws UnsupportedOperationException {

                Object menuItem_Command = e.getActionCommand();

                System.out.println(menuItem_Command);

                if (menuItem_Command.equals("Change Name")) {
                    System.out.println("Yippe");
                    //                  userName.setUserName(userName.getUserName());
                } else if (menuItem_Command.equals("Exit")) {
                    System.exit(0);
                }

            }

        }
    }

    public class TestPane extends JPanel {

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }
}

It is probably working, but you do not get feedback because you are changing the name to the previous one. 它可能正在工作,但是您没有得到反馈,因为您将名称更改为上一个。 If you put some other value in the setUserName method you will see 如果在setUserName方法中输入其他值,您将看到

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

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