【问题标题】:Menu Listener Action Performed执行的菜单侦听器操作
【发布时间】:2018-06-16 04:39:34
【问题描述】:
import javax.swing.*;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import java.awt.*;

class displaymsg extends JFrame {
    public static void main(String args []){
        JFrame f = new JFrame();
        JMenuBar mb = new JMenuBar();
        JMenu supply = new JMenu("supply");
        JMenuItem addnew = new JMenuItem("add");

        addnew.addMenuListener(new MenuListener(){
            @Override
            public void menuSelected(MenuEvent me){
                JOptionPane.showMessageDialog(f,"under construction");
            }
        });
        f.add(mb); mb.add(supply);
        supply.add("New Product");
        f.setSize(400, 400);
        f.setJMenuBar(mb);
        f.setLayout(null);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
} 

这是我的 menuListener 代码,但我不知道如何执行此操作
如果有人对我可能做错了什么有任何想法,请指出来

【问题讨论】:

  • but I didn't get how to do this - 阅读 How to Use Menus 上的 Swing 教程中的部分以获取工作示例。请保留指向该教程的链接,因为它包含所有 Swing 基础知识的示例。

标签: java swing jmenuitem jmenubar


【解决方案1】:

见cmets在下面mcve

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.JOptionPane;

//see https://www.javatpoint.com/java-naming-conventions
//the class does not need to extend JFrame if not used as JFrame
public class DisplayMsg{

    public static void main(String args []){
        JFrame f = new JFrame();

        JMenu supply = new JMenu("Supply");
        supply.add("New Product");
        JMenuItem addNew = new JMenuItem("Add"); //naming conventions

        addNew.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(f,"under construction");
            }
        });

        JMenuBar mb = new JMenuBar();
        mb.add(supply);
        mb.add(addNew); //missing in your code
        //f.add(mb); this would add the menu to the content pane 
        f.setJMenuBar(mb); 

        f.setSize(400, 400);
        //f.setLayout(null);  // do not use null layout
                              //see https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

MenuListener 可以添加到 JMenu,而不是 JMenuItem。如果你想使用它 将addNew 更改为JMenu

    JMenu addNew = new JMenu("Add"); 
    addNew.addMenuListener(new MenuListener(){
        @Override
        public void menuSelected(MenuEvent me){
            JOptionPane.showMessageDialog(f,"under construction");
        }

        @Override
        public void menuCanceled(MenuEvent e) {}

        @Override
        public void menuDeselected(MenuEvent e) {}
    });

【讨论】:

  • @esQmo_ 谢谢,但我的开放频道已经太多了(0:
【解决方案2】:

试试这个。这就是重点。菜单是一种组织事物的方式。你有一个JMenuBar,它由一组Menus 组成。每个菜单都有一组MenuItems。您只需将ActionListener 添加到MenuItem 即可处理事件。

public class DisplayMsg {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        JMenuBar mb = new JMenuBar();
        JMenu supply;
        JMenuItem addnew;
        supply = new JMenu("supply");
        addnew = new JMenuItem("add");
        // JButton b = new JButton("click me");
        // b.setBounds(100,120,100,40);
        addnew.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(f, "under construction");

            }
        });
        // f.add(b);
        f.add(mb);
        mb.add(supply);
        supply.add(addnew);
        supply.add("New Product");
        f.setSize(400, 400);
        f.setJMenuBar(mb);
        f.setLayout(null);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

}

【讨论】:

  • @sanjaYbhandari 这里的协议要么支持投票,要么反对投票或将其标记为答案。仅供参考,因为您是这里的新手。
  • 它对之前发布的答案添加了什么?
  • 略有不同。在上一个答案mb.add(addNew); 但在我的答案是supply.add(addnew);
  • @c0der 上一个答案将 menuitem 添加到菜单栏,但我的将 menuitem 添加到菜单。对我来说,这就是两者之间的主要区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2020-07-20
相关资源
最近更新 更多