如何从另一个java类添加操作侦听器?

如何从另一个java类添加操作侦听器?,java,swing,actionlistener,Java,Swing,Actionlistener,我想开发一个非常基本的应用程序,这是代码,我有4个类,一个是主类,第二个是JMenuBar,第三个是Panel,第四个是Action Listener。目前我的问题是如何为JMenuBar类添加Action Listener实例,直到我可以执行一些操作为止 你所拥有的是正确的。 它应该调用在您单击“文件”菜单项时执行的操作。只需在该方法中添加一个print ln,就可以看到它被调用。这是我为您准备的测试程序 执行菜单程序时检查控制台输出 package just.test; import

我想开发一个非常基本的应用程序,这是代码,我有4个类,一个是主类,第二个是
JMenuBar
,第三个是
Panel
,第四个是Action Listener。目前我的问题是如何为
JMenuBar
类添加Action Listener实例,直到我可以执行一些操作为止



你所拥有的是正确的。
它应该调用在您单击“文件”菜单项时执行的操作。只需在该方法中添加一个print ln,就可以看到它被调用。

这是我为您准备的测试程序

执行菜单程序时检查控制台输出

package just.test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class My_Menu extends JMenuBar implements ActionListener {

    private static final long serialVersionUID = 1L;
    private My_Action my_action = new My_Action();

    JMenu file;
    JMenu Edit;
    JMenu help;

    public My_Menu() {
        file = new JMenu("File");
        Edit = new JMenu("Edit");
        help = new JMenu("help");

        this.add(file);
        this.add(Edit);
        this.add(help);

        JMenuItem item1 = new JMenuItem("file");
        item1.setActionCommand("file");
        JMenuItem item2 = new JMenuItem("New");
        item2.setActionCommand("New");
        JMenuItem item3 = new JMenuItem("Setting");
        item3.setActionCommand("Setting");
        JMenuItem item4 = new JMenuItem("Color");
        item4.setActionCommand("Color");
        JMenuItem item5 = new JMenuItem("Print");
        item5.setActionCommand("Print");
        JMenuItem item6 = new JMenuItem("Exit");
        item6.setActionCommand("Exit");

        JMenuItem item7 = new JMenuItem("edit1");
        item7.setActionCommand("edit1");
        JMenuItem item8 = new JMenuItem("edit2");
        item8.setActionCommand("edit2");
        JMenuItem item9 = new JMenuItem("about..");
        item9.setActionCommand("about");


        file.add(item1);
        file.add(item2);
        file.addSeparator();
        file.add(item3);
        file.add(item4);
        file.add(item5);
        file.add(item6);


        Edit.add(item7);
        Edit.add(item8);


        help.add(item9);

        item1.addActionListener(my_action);
        item2.addActionListener(my_action);
        item3.addActionListener(my_action);
        item4.addActionListener(my_action);
        item5.addActionListener(my_action);

        item7.addActionListener(this);
        item8.addActionListener(this);
        item9.addActionListener(this);

        file.addActionListener(this);
        Edit.addActionListener(this);
        help.addActionListener(my_action);

    }


    @Override
    public void actionPerformed(ActionEvent actionEvent) {  
        String command = actionEvent.getActionCommand();
        System.out.println("----1----\n" + command);

        //System.exit(0);
    }

    class My_Action implements ActionListener {

        public My_Action() {

        }

        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            String command = actionEvent.getActionCommand();
            System.out.println("----2----\n" + command);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();

                JPanel jp = new JPanel();
                jp.setLayout(new BorderLayout());
                f.add(new My_Menu(), BorderLayout.NORTH);
                f.add(jp, BorderLayout.CENTER);
                jp.setSize(500,400);
                f.setSize(800, 600);
                f.setVisible(true);

                //f.pack();
            }
        });
    }


}
您只需将addActionListener添加到必须在其中发送消息的组件中

item1.addActionListener(my_action);


别忘了在“我的菜单”类上实现ActionListener。

这里到底有什么问题?编译/运行代码时,您是否遇到任何错误?首先,感谢您的快速响应,我没有错误,只是我想实现从My_Action到My_Menu类的操作侦听器,我该怎么做?问题是,您采取了错误的方法
JMenuBar
可以有多个
JMenu
项,每个
JMenu
可以有多个
JMenuItem
ActionListener
应该添加到
JMenuItem
上,而不是添加到
JMenuBar
上。如果您只想对所有
JMenuItem
使用一个
ActionListener
,您可能需要对它们使用不同的actionCommand。然后,在您的
actionPerformed
方法中,您应该使用一种控制结构,例如
if else
switch case
,以确定单击了哪一个。如果您可以将我的兄弟也添加进来,则item1.addActionListener(我的动作);不在jmenu中这最适合作为评论,而不是回答。感谢您的快速回复,好的,我如何实现项2的操作侦听器我在我的_action类中加入并将System.out.print(“Hello”);现在正在工作,但我不知道为什么我的操作在my_jmenu类中不工作–我在my_jmenu类中实现了action listener。当您向
JMenuItem
s添加一个,然后在ActionListener中阅读它们时,事件处理可能会得到改进。我也做了这个,但它不做任何操作。我在我的_action类中进行了操作,并将System.out.print(“Hello”);正在工作,但我不知道为什么我的操作在类中不起作用。你在开发环境中尝试过我的测试代码吗?我刚刚用操作命令更新了测试代码。我想你必须给我看所有的密码。
package just.test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class My_Menu extends JMenuBar implements ActionListener {

    private static final long serialVersionUID = 1L;
    private My_Action my_action = new My_Action();

    JMenu file;
    JMenu Edit;
    JMenu help;

    public My_Menu() {
        file = new JMenu("File");
        Edit = new JMenu("Edit");
        help = new JMenu("help");

        this.add(file);
        this.add(Edit);
        this.add(help);

        JMenuItem item1 = new JMenuItem("file");
        item1.setActionCommand("file");
        JMenuItem item2 = new JMenuItem("New");
        item2.setActionCommand("New");
        JMenuItem item3 = new JMenuItem("Setting");
        item3.setActionCommand("Setting");
        JMenuItem item4 = new JMenuItem("Color");
        item4.setActionCommand("Color");
        JMenuItem item5 = new JMenuItem("Print");
        item5.setActionCommand("Print");
        JMenuItem item6 = new JMenuItem("Exit");
        item6.setActionCommand("Exit");

        JMenuItem item7 = new JMenuItem("edit1");
        item7.setActionCommand("edit1");
        JMenuItem item8 = new JMenuItem("edit2");
        item8.setActionCommand("edit2");
        JMenuItem item9 = new JMenuItem("about..");
        item9.setActionCommand("about");


        file.add(item1);
        file.add(item2);
        file.addSeparator();
        file.add(item3);
        file.add(item4);
        file.add(item5);
        file.add(item6);


        Edit.add(item7);
        Edit.add(item8);


        help.add(item9);

        item1.addActionListener(my_action);
        item2.addActionListener(my_action);
        item3.addActionListener(my_action);
        item4.addActionListener(my_action);
        item5.addActionListener(my_action);

        item7.addActionListener(this);
        item8.addActionListener(this);
        item9.addActionListener(this);

        file.addActionListener(this);
        Edit.addActionListener(this);
        help.addActionListener(my_action);

    }


    @Override
    public void actionPerformed(ActionEvent actionEvent) {  
        String command = actionEvent.getActionCommand();
        System.out.println("----1----\n" + command);

        //System.exit(0);
    }

    class My_Action implements ActionListener {

        public My_Action() {

        }

        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            String command = actionEvent.getActionCommand();
            System.out.println("----2----\n" + command);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();

                JPanel jp = new JPanel();
                jp.setLayout(new BorderLayout());
                f.add(new My_Menu(), BorderLayout.NORTH);
                f.add(jp, BorderLayout.CENTER);
                jp.setSize(500,400);
                f.setSize(800, 600);
                f.setVisible(true);

                //f.pack();
            }
        });
    }


}
item1.addActionListener(my_action);
item7.addActionListener(this);