-------------siwuxie095
工程名:TestSwingPopupMenu
包名:com.siwuxie095.popupmenu
类名:MyFrame.java
工程结构目录如下:
MyFrame.java:
package com.siwuxie095.popupmenu; import java.awt.BorderLayout; import java.awt.Component; import java.awt.EventQueue; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.EmptyBorder; import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JCheckBoxMenuItem; import javax.swing.JRadioButtonMenuItem; public class MyFrame extends JFrame { private JPanel contentPane; JPopupMenu popupMenu; /** * Launch the application. */ public static EventQueue.invokeLater(new Runnable() { public try { MyFrame frame = new MyFrame(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MyFrame() { //设定成 Windows 样式的 LookAndFeel try { UIManager.setLookAndFeel(new WindowsLookAndFeel()); } catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); } setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BorderLayout(0, 0)); //手动为 contentPane 添加鼠标点击事件:鼠标左键点击弹框 contentPane.addMouseListener(new MouseAdapter() { @Override public //指明调用者,显示弹框的 X Y 坐标即点击的位置 popupMenu.show(MyFrame.this, e.getX(), e.getY()); } }); //将 popupMenu 的声明转移到类中 popupMenu = new JPopupMenu(); //可以将 JPopupMenu 添加到 contentPane 中,也可以不添加 //将下面的 addPopup() 注释掉即不添加 addPopup(contentPane, popupMenu); JMenuItem mntmX = new JMenuItem("X"); popupMenu.add(mntmX); JMenuItem mntmY = new JMenuItem("Y"); popupMenu.add(mntmY); JMenuItem mntmZ = new JMenuItem("Z"); popupMenu.add(mntmZ); //分隔线,可以使用代码手动实现, //也可以使用控件(组件) JSeparator 拖动实现 JSeparator separator = new JSeparator(); popupMenu.add(separator); JMenu mnNum = new JMenu("Num"); popupMenu.add(mnNum); JMenuItem menuItem = new JMenuItem("1"); mnNum.add(menuItem); JMenuItem menuItem_1 = new JMenuItem("2"); mnNum.add(menuItem_1); JMenuItem menuItem_2 = new JMenuItem("3"); mnNum.add(menuItem_2); JSeparator separator_1 = new JSeparator(); popupMenu.add(separator_1); JMenuItem mntmClose = new JMenuItem("Close"); //对菜单项:Close 添加 actionPerformed 事件 //点击 Close 关闭程序(注意:添加鼠标点击事件无效) mntmClose.addActionListener(new ActionListener() { public System.exit(0); } }); JCheckBoxMenuItem chckbxmntmC1 = new JCheckBoxMenuItem("C1"); chckbxmntmC1.setSelected(true); popupMenu.add(chckbxmntmC1); JCheckBoxMenuItem chckbxmntmC2 = new JCheckBoxMenuItem("C2"); popupMenu.add(chckbxmntmC2); JRadioButtonMenuItem rdbtnmntmR1 = new JRadioButtonMenuItem("R1"); rdbtnmntmR1.setSelected(true); popupMenu.add(rdbtnmntmR1); JRadioButtonMenuItem rdbtnmntmR2 = new JRadioButtonMenuItem("R2"); popupMenu.add(rdbtnmntmR2); popupMenu.add(mntmClose); } //这是将 JPopupMenu 添加到 contentPane 中,自动生成的代码 private static component.addMouseListener(new MouseAdapter() { //鼠标右键点击弹框 public if (e.isPopupTrigger()) { showMenu(e); } } //鼠标右键点击弹框 public if (e.isPopupTrigger()) { showMenu(e); } } private popup.show(e.getComponent(), e.getX(), e.getY()); } }); } } |
将窗体
JFrame 的 LookAndFeel 设定为 Windows
向窗体 JFrame 添加一个 JPopupMenu
添加完成,注意:JPopupMenu 添加在 contentPane 内
也可以到
Source 中将 JPopupMenu 设定为不放在 contentPane 中
需要为
JPopupMenu 添加元素
(1)添加 JMenu 和 JMenuItem
JMenu 是一个菜单,而 JMenuItem 是一个菜单元素(菜单项)
每一个
JMenu 可以包含 JMenu 和 JMenuItem,即 可以有子菜单
(2)添加 JCheckBoxMenuItem 和 JRadioButtonMenuItem
JCheckBoxMenuItem 是复选框组成的菜单项,其 selected 属性可以设置默认勾选项
「当对元素(菜单项)的状态进行设定时需要用到复选框」
JRadioButtonMenuItem 是单选按钮组成的菜单项,其 selected 属性可以设置默认勾选项
需要将
JRadioButtonMenuItem 添加到 ButtonGroup,才能实现单选
「ButtonGroup 本身不是控件(组件),不能放到容器中,且不可视」
(3)添加
分隔线:可以通过控件(组件) JSeparator 实现菜单栏的分隔
(4)当
弹出菜单
创建完毕后,还可以设定其
字体、对齐方式、图标等,
还要对具体的
菜单项
指定动作(添加
actionPerformed 事件)
如:为
Close 菜单项添加 actionPerformed 事件,当点击 Close 时,关闭程序
运行程序:
【made by siwuxie095】