-------------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 void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { 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 void mouseClicked(MouseEvent e) { //指明调用者,显示弹框的 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 void actionPerformed(ActionEvent e) { 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 void addPopup(Component component, final JPopupMenu popup) { component.addMouseListener(new MouseAdapter() { //鼠标右键点击弹框 public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } } //鼠标右键点击弹框 public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } } private void showMenu(MouseEvent e) { 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】
原文:http://www.cnblogs.com/siwuxie095/p/6670925.html