【问题标题】:How to add Action Listener from another class java?如何从另一个类 java 添加动作侦听器?
【发布时间】:2018-01-16 05:28:43
【问题描述】:

我想开发一个非常基础的应用程序,代码如下,我有4个类,一个是主类,第二个是JMenuBar,第三个是Panel,第四个是Action听者。目前我的问题是如何为JMenuBar 类添加动作监听器实例,直到我可以做一些动作。


public class My_Action implements ActionListener {


    public My_Action() {

    }

    @Override
    public void actionPerformed(ActionEvent actionEvent) {

    }

}

public class My_Menu extends JMenuBar {


    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");


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

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

        file.addSeparator();
        this.add(file);
        this.add(Edit);
        this.add(help);
        item1.addActionListener(my_action);


    }
    public void actionPerformed(ActionEvent actionEvent){
          System.exit(0);
    }
}

【问题讨论】:

  • 这里到底有什么问题?您在编译/运行代码时是否遇到任何错误?
  • 首先感谢您的快速响应,我没有错误只是我想实现从 My_Action 到 My_Menu 类的动作侦听器,我该怎么做?
  • 这里的事情是,你采取了错误的方法。 JMenuBar 可以有多个 JMenu 项目,每个 JMenu 可以有多个 JMenuItemActionListener 应该添加到 JMenuItem 而不是 JMenuBar
  • 如果您只想为所有JMenuItems 使用一个ActionListener,您可能需要为它们使用不同的ActionCommand。然后你在你的actionPerformed方法中你应该使用一个控制结构比如if-else或者switch-case来找出它们中的哪一个被点击了。
  • 如果你能把我也加入进来,item1.addActionListener(my_action);不在 JMenu 中

标签: java swing actionlistener


【解决方案1】:

这是我给你的测试程序。

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

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);

item7.addActionListener(this);

不要忘记在 My_Menu 类上实现 ActionListener。

【讨论】:

  • 当您将 ActionCommand 添加到 JMenuItems 并稍后在 ActionListener 中使用 ActionEvent.getActionCommand() 读取它们时,可以改进事件处理
  • 我也做了这个,但它没有做任何动作
  • 我进入了 my_action 类并输入了 System.out.print("Hello");现在正在工作,但我不知道为什么我的操作在 my_jmenu 类中不起作用
  • 您是否在您的开发环境中尝试过我的测试代码?我刚刚为您更新了带有操作命令的测试代码。我认为你必须向我展示所有代码。
【解决方案2】:

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

【讨论】:

  • 这最适合作为评论而不是答案。
  • 感谢您的快速响应,好的,我该如何实现 item2 的动作监听器
  • 我进入了 my_action 类并输入了 System.out.print("Hello");现在正在工作,但我不知道为什么我的操作在 my_jmenu 类中不起作用 -
  • 我也在 my_jmenu 类中实现动作监听器
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多