弹出菜单是GUI程序中非常常见的一种控件。它通常由鼠标右击事件触发,比如在windows系统桌面上右击时,会弹出一个包含“刷新”、“属性”等菜单的弹出菜单。Swing中的弹出菜单是JPopupMenu,它的基本性质与JMenu类似,可以使用add方法给它内部添加JMenu或者JMenuItem。手动显示JPopupMenu时,需使用show(parentComponent, x, y)方法,指定父控件和显示坐标。用户的操作习惯是在右击某个 控件时显示弹出菜单,那么需要使用component.setComponentPopupMenu(popupMenu)方法来添加该弹出菜单。偶尔会遇到在已经包含弹出菜单的控件内再添加子控件的情况,这时子控件可以使用child.setInheritsPopupMenu(true)来继承该弹出菜单。

下面是JPopupMenu常用方法:

为了练手,我们来模仿实现eclipse中编辑区域的弹出菜单,代码如下:

  1. package Swing;
  2. import java.awt.event.InputEvent;
  3. import java.awt.event.KeyEvent;
  4.  
  5. import javax.swing.Icon;
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JFrame;
  8. import javax.swing.JMenu;
  9. import javax.swing.JMenuItem;
  10. import javax.swing.JPanel;
  11. import javax.swing.JPopupMenu;
  12. import javax.swing.KeyStroke;
  13.  
  14. /*
  15. *模仿实现eclipse中编辑区域的弹出菜单
  16. */
  17. public class JPopupMenuDemo extends JFrame {
  18.  
  19. JPopupMenu popupMenu;
  20.  
  21. public JPopupMenuDemo(){
  22. JMenuItem menuItem;//用作临时变量
  23.  
  24. popupMenu = new JPopupMenu();
  25. popupMenu.add(createMenuItem("Undo Typing", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\undoTyping.png"), KeyStroke.getKeyStroke('Z', InputEvent.CTRL_MASK)));
  26. popupMenu.add(createMenuItem("Revert File", null, null, null));
  27. popupMenu.add(createMenuItem("Save", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\save.png"), KeyStroke.getKeyStroke('S', InputEvent.CTRL_MASK)));
  28. popupMenu.addSeparator();
  29. popupMenu.add(createMenuItem("Open Declaration", null, null, KeyStroke.getKeyStroke("F3")));
  30. popupMenu.add(createMenuItem("Open Type Hierarchy", null, null, KeyStroke.getKeyStroke("F4")));
  31. popupMenu.add(createMenuItem("Open Call Hierarchy", null, null, KeyStroke.getKeyStroke('H', InputEvent.CTRL_MASK | InputEvent.ALT_MASK)));
  32. popupMenu.add(createMenuItem("Show in Breakcrumb", null, null, KeyStroke.getKeyStroke('B', InputEvent.SHIFT_MASK | InputEvent.ALT_MASK)));
  33. popupMenu.add(createMenuItem("Quick Outline", null, null, KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK)));
  34. popupMenu.add(createMenuItem("Quick Type Hierarchy", null, null, KeyStroke.getKeyStroke('T', InputEvent.CTRL_MASK)));
  35. popupMenu.add(createMenuNamedOpenWith());
  36. popupMenu.add(createMenuNamedShowIn());
  37. popupMenu.addSeparator();
  38. menuItem = popupMenu.add(createMenuItem("Cut", null, null, KeyStroke.getKeyStroke('X', InputEvent.CTRL_MASK)));
  39. menuItem.setEnabled(false);
  40. menuItem = popupMenu.add(createMenuItem("Copy", null, null, KeyStroke.getKeyStroke('C', InputEvent.CTRL_MASK)));
  41. menuItem.setEnabled(false);
  42. popupMenu.add(createMenuItem("Copy Qualified Name", null, null, null));
  43. popupMenu.add(createMenuItem("Paste", null, null, KeyStroke.getKeyStroke('V', InputEvent.CTRL_MASK)));
  44. popupMenu.addSeparator();
  45. popupMenu.add(createMenuItem("Quick Fix", null, null, KeyStroke.getKeyStroke('1', InputEvent.CTRL_MASK)));
  46. popupMenu.add(createMenuNamedSource());
  47. popupMenu.add(createMenuNamedRefactor());
  48. popupMenu.add(createMenuNamedLocalHistory());
  49. popupMenu.addSeparator();
  50. popupMenu.add(createMenuNamedReferences());
  51. popupMenu.add(createMenuNamedDeclarations());
  52. popupMenu.add(createMenuItem("Add To Snippets", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\addToSnippets.png"), null));
  53. popupMenu.addSeparator();
  54. popupMenu.add(createMenuNamedDebugAs());
  55. popupMenu.add(createMenuNamedRunAs());
  56. popupMenu.add(createMenuItem("Validate", null, null, null));
  57. popupMenu.add(createMenuNamedTeam());
  58. popupMenu.add(createMenuNamedCompareWith());
  59. popupMenu.add(createMenuNamedReplaceWith());
  60. popupMenu.addSeparator();
  61. popupMenu.add(createMenuItem("Prefrences", null, null, null));
  62. popupMenu.addSeparator();
  63. popupMenu.add(createMenuItem("Remove from Context", null, null, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.CTRL_MASK | InputEvent.ALT_MASK | InputEvent.SHIFT_MASK)));
  64.  
  65. JPanel panel = new JPanel();
  66. panel.setComponentPopupMenu(popupMenu);
  67. add(panel);
  68. }
  69.  
  70. private JMenu createMenuNamedReplaceWith() {
  71. /*
  72. * * 创建名称为ReplaceWith的menu
  73. */
  74. JMenu menu = createMenu("Replace With", null);
  75. menu.add(createMenuItem("Local History", null, null, null));
  76. menu.add(createMenuItem("Previous From History", null, null, null));
  77.  
  78. return menu;
  79. }
  80.  
  81. private JMenu createMenuNamedCompareWith() {
  82. /*
  83. * * 创建名称为CompareWith的menu
  84. */
  85. JMenu menu = createMenu("Compare With", null);
  86. JMenuItem menuItem = menu.add(createMenuItem("Each Other", null, null, null));
  87. menuItem.setEnabled(false);
  88. menu.add(createMenuItem("Local History", null, null, null));
  89.  
  90. return menu;
  91. }
  92.  
  93. private JMenu createMenuNamedTeam() {
  94. /*
  95. * * 创建名称为Team的menu
  96. */
  97. JMenu menu = createMenu("Team", null);
  98. menu.add(createMenuItem("Apply Patch", null, null, null));
  99. menu.add(createMenuItem("Show Local History", null, null, null));
  100. JMenuItem menuItem= menu.add(createMenuItem("Share Project", null, null, null));
  101. menuItem.setEnabled(false);
  102. return menu;
  103. }
  104.  
  105. private JMenu createMenuNamedRunAs() {
  106. /*
  107. * * 创建名称为RunAs的menu
  108. */
  109. JMenu menu = createMenu("Run As", null);
  110. menu.add(createMenuItem("Java Application", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\javaApplication.png"),KeyStroke.getKeyStroke('X', InputEvent.ALT_MASK | InputEvent.SHIFT_MASK)));
  111. menu.addSeparator();
  112. menu.add(createMenuItem("Debug Configurations", null, null, null));
  113.  
  114. return menu;
  115. }
  116.  
  117. private JMenu createMenuNamedDebugAs() {
  118. /*
  119. * * 创建名称为DebugAs的menu
  120. */
  121. JMenu menu = createMenu("Debug As", null);
  122. menu.add(createMenuItem("Java Application", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\javaApplication.png"),KeyStroke.getKeyStroke('D', InputEvent.ALT_MASK | InputEvent.SHIFT_MASK)));
  123. menu.addSeparator();
  124. menu.add(createMenuItem("Debug Configurations", null, null, null));
  125.  
  126. return menu;
  127. }
  128.  
  129. private JMenu createMenuNamedDeclarations() {
  130. /*
  131. * * 创建名称为Declarations的menu
  132. */
  133. JMenu menu = createMenu("Declarations", null);
  134. menu.add(createMenuItem("workSpace", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\declarationsIcon.png"),KeyStroke.getKeyStroke('G', InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
  135. menu.add(createMenuItem("Project", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\declarationsIcon.png"),null));
  136. menu.add(createMenuItem("Hierarchy", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\declarationsIcon.png"),null));
  137. menu.addSeparator();
  138. menu.add(createMenuItem("WorkingSet", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\declarationsIcon.png"),null));
  139.  
  140. return menu;
  141. }
  142.  
  143. private JMenu createMenuNamedReferences() {
  144. /*
  145. * * 创建名称为References的menu
  146. */
  147. JMenu menu = createMenu("References", null);
  148. menu.add(createMenuItem("workSpace", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\ReferencesIcon.png"),KeyStroke.getKeyStroke('G', InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
  149. menu.add(createMenuItem("Project", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\ReferencesIcon.png"),null));
  150. menu.add(createMenuItem("Hierarchy", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\ReferencesIcon.png"),null));
  151. menu.addSeparator();
  152. menu.add(createMenuItem("WorkingSet", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\ReferencesIcon.png"),null));
  153.  
  154. return menu;
  155. }
  156.  
  157. private JMenu createMenuNamedLocalHistory() {
  158. /*
  159. * * 创建名称为LocalHistory的menu
  160. */
  161. JMenu menu = createMenu("Local History", null);
  162. menu.add(createMenuItem("Compare With", null, null,null));
  163. menu.add(createMenuItem("Replace With Previous", null, null,null));
  164. menu.add(createMenuItem("Replace With", null, null,null));
  165. menu.add(createMenuItem("Restore From", null, null,null));
  166.  
  167. return menu;
  168. }
  169.  
  170. private JMenu createMenuNamedRefactor() {
  171. /*
  172. * * 创建名称为Refactor的menu
  173. */
  174. JMenu menu = createMenu("Refactor", null);
  175. menu.add(createMenuItem("Move", null, null,KeyStroke.getKeyStroke('V', InputEvent.SHIFT_MASK | InputEvent.ALT_MASK)));
  176. menu.addSeparator();
  177. menu.add(createMenuItem("Change Method Signature", null, null,KeyStroke.getKeyStroke('C', InputEvent.SHIFT_MASK | InputEvent.ALT_MASK)));
  178. menu.addSeparator();
  179. menu.add(createMenuItem("Extract Interface", null, null,null));
  180. menu.add(createMenuItem("Extract Superclass", null, null,null));
  181. menu.add(createMenuItem("Use Suppertype where Possible", null, null,null));
  182. menu.add(createMenuItem("Pull Up", null, null,null));
  183. menu.add(createMenuItem("Push Down", null, null,null));
  184. menu.addSeparator();
  185. menu.add(createMenuItem("Extract Class", null, null,null));
  186. menu.add(createMenuItem("Introduce Parameter Object", null, null,null));
  187. menu.addSeparator();
  188. menu.add(createMenuItem("Infer Generic Type Arguments", null, null,null));
  189.  
  190. return menu;
  191. }
  192.  
  193. private JMenu createMenuNamedSource() {
  194. /*
  195. * * 创建名称为Source的menu
  196. */
  197. JMenu menu = createMenu("Source", null);
  198. menu.add(createMenuItem("Toggle Comment", null, null,KeyStroke.getKeyStroke('/', InputEvent.CTRL_MASK)));
  199. menu.add(createMenuItem("Remove Bolck Comment", null, null,KeyStroke.getKeyStroke('\\', InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
  200. menu.add(createMenuItem("Generate Element Comment", null, null,KeyStroke.getKeyStroke('J', InputEvent.SHIFT_MASK | InputEvent.ALT_MASK)));
  201. menu.addSeparator();
  202. menu.add(createMenuItem("Corrent Indentation", null, null, KeyStroke.getKeyStroke('I', InputEvent.CTRL_MASK)));
  203. menu.add(createMenuItem("Format Element", null, null,null));
  204. menu.add(createMenuItem("Format ", null, null,KeyStroke.getKeyStroke('F', InputEvent.SHIFT_MASK | InputEvent.ALT_MASK)));
  205. menu.addSeparator();
  206. menu.add(createMenuItem("Add Import", null, null,KeyStroke.getKeyStroke('M', InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
  207. menu.add(createMenuItem("Organize Imports", null, null,KeyStroke.getKeyStroke('O', InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK)));
  208. menu.add(createMenuItem("Sort Members", null, null,null));
  209. menu.add(createMenuItem("Clean Up", null, null,null));
  210. menu.addSeparator();
  211. menu.add(createMenuItem("Override/Implement Methods", null, null,null));
  212. menu.add(createMenuItem("Generate Getters and Setters", null, null,null));
  213. menu.add(createMenuItem("Generate Delegate Methods", null, null,null));
  214. menu.add(createMenuItem("Generate hashCode() and equals()", null, null,null));
  215. menu.add(createMenuItem("Generate toString()", null, null,null));
  216. menu.add(createMenuItem("Generate Constructor using Fields", null, null,null));
  217. menu.add(createMenuItem("Generate Constructor from Superclass", null, null,null));
  218. menu.addSeparator();
  219. menu.add(createMenuItem("Externalize Strings", null, null,null));
  220.  
  221. return menu;
  222. }
  223.  
  224. private JMenu createMenuNamedShowIn() {
  225. /*
  226. * * 创建名称为ShowIn的menu
  227. */
  228. JMenu menu = createMenu("Show In", null);
  229. menu.add(createMenuItem("Git Repositories", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\gitRepositories.png"), null));
  230. menu.add(createMenuItem("Package Explorer", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\packageExplorer.png"), null));
  231. menu.add(createMenuItem("History", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\history.png"), null));
  232. menu.add(createMenuItem("Navigator", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\navigator.png"), null));
  233. menu.add(createMenuItem("Project Explorer", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\projectExplorer.png"), null));
  234. menu.add(createMenuItem("Outline", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\outline.png"), null));
  235. menu.add(createMenuItem("System Explorer", null, null, null));
  236. menu.add(createMenuItem("Properties", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\Properties.png"), null));
  237. return menu;
  238. }
  239.  
  240. private JMenu createMenuNamedOpenWith() {
  241. /*
  242. * * 创建名称为OpenWith的menu
  243. */
  244. JMenu menu = createMenu("Open With", null);
  245. menu.add(createMenuItem("Java Editor", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\JavaEditor.png"), null));
  246. menu.add(createMenuItem("Text Editor", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\textEditor.png"), null));
  247. menu.add(createMenuItem("Window Builder Editor", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\windowBuilderEditor.png"), null));
  248. menu.addSeparator();
  249. menu.add(createMenuItem("System Editor", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\systemEditor.png"), null));
  250. menu.add(createMenuItem("In-Place Editor", null, new ImageIcon("resources\\JPopupMenuDemo\\icon\\inPlaceEditor.png"), null));
  251. menu.add(createMenuItem("Default Editor", null, null, null));
  252. menu.addSeparator();
  253. menu.add(createMenuItem("Other", null, null, null));
  254. return menu;
  255. }
  256.  
  257. private JMenu createMenu(String name, String mnemonic) {
  258. /*
  259. * 根据名称和快捷键创建menu并添加到menuBar
  260. */
  261. JMenu menu = new JMenu(name);
  262. if (mnemonic != null)
  263. menu.setMnemonic(mnemonic.toCharArray()[0]);
  264. return menu;
  265. }
  266.  
  267. private JMenuItem createMenuItem(String name, String mnemonic, Icon icon, KeyStroke keyStroke) {
  268. /*
  269. * 根据名称和快捷键创建menu并添加到menuBar
  270. */
  271. JMenuItem menuItem = new JMenuItem(name, icon);
  272. if (mnemonic != null)
  273. menuItem.setMnemonic(mnemonic.toCharArray()[0]);
  274. if (keyStroke != null)
  275. menuItem.setAccelerator(keyStroke);
  276. return menuItem;
  277. }
  278.  
  279. public static void main(String[] args) {
  280. // TODO Auto-generated method stub
  281. // 创建窗体
  282. JPopupMenuDemo frame = new JPopupMenuDemo();
  283. //指定标题
  284. frame.setTitle("JPopupMenuDemo");
  285. //指定icon
  286. frame.setIconImage(new ImageIcon("resources\\JMenuDemo\\icon\\Eclipse.png").getImage());
  287. // 关闭窗体后退出程序
  288. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  289. // 自动适配所有控件大小
  290. frame.setSize(frame.getPreferredSize().width, 200);
  291. //frame.pack();
  292. // 设置窗体位置在屏幕中央
  293. frame.setLocationRelativeTo(null);
  294. // 显示窗体
  295. frame.setVisible(true);
  296. }
  297.  
  298. }

运行效果图1:

运行效果图2:

图标目录:

Swing-JPopupMenu弹出菜单用法-入门的更多相关文章

  1. Web标准:四、纵向导航菜单及二级弹出菜单

    Web标准:四.纵向导航菜单及二级弹出菜单 知识点: 1.纵向列表 2.标签的默认样式 3.css派生选择器 4.css选择器的分组 5.纵向二级列表 6.相对定位和绝对定位   1)纵向列表 可以看 ...

  2. css+html+js实现多级下拉和弹出菜单

    本文将使用css+html+js实现横向菜单.具有多级弹出菜单下拉. 首先我们来看看效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvajkwMzgy ...

  3. 向上弹出菜单jQuery插件

    插件名:柯乐义英文名:Keleyijs文件名称:jquery.keleyi.js插件功能:该插件可以让你轻易地在页面上构建一个向上弹出的二级菜单. 示例查看:http://keleyi.com/kel ...

  4. html5手机端遮罩弹出菜单代码

    效果体验:http://hovertree.com/texiao/html5/17/ 效果图: 代码如下: <!doctype html> <html lang="zh&q ...

  5. DIV+CSS制作二级横向弹出菜单,略简单

    没有使用JavaScript控制二级菜单的显示,结果如上图所示. 代码如下: <!DOCTYPE html> <html> <head> <meta char ...

  6. vc++ 如何添加右键弹出菜单

    一.创建新工程 二.编辑菜单资源 1.添加菜单 按"Ctrl+R",双击"Menu"图标 2.于菜单编辑器内编辑菜单 四.添加代码(红色部分) void CCM ...

  7. 创建 iPhone/iOS8 弹出菜单(窗口)

    基本步骤 添加视图:主视图与弹出视图 关联视图 配置弹出视图 编码实现:弹出菜单样式及控制器委托 override func prepareForSegue(segue: UIStoryboardSe ...

  8. android 单选、多选弹出菜单

    菜单单选窗口: import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInte ...

  9. [Flex] PopUpButton系列 —— 弹出菜单的行高设置

    <?xml version="1.0" encoding="utf-8"?> <!--Flex中如何通过variableRowHeight样式 ...

随机推荐

  1. Android Studio 或 IntelliJ IDEA获取数字签名的方法

    原先在 Eclipse中 数字签名(SHA1或MD5)的获取方法 为: 点击 Eclipse导航栏的Windows --> Preference --> Android --> Bu ...

  2. Activity中finish()和onDestroy()的区别

    finish()方法用于结束一个Activity的生命周期,而onDestory()方法则是Activity的一个生命周期方法,其作用是在一个Activity对象被销毁之前,Android系统会调用该 ...

  3. Can not issue data manipulation statements with executeQuery().解决的方法

    query是查询用的,而update是插入和更新,删除修改用的. executeQuery()语句是用于产生单个结果集的语句,如select语句,在什么情况下用,当你的数据库已经保存了数据后,要进行查 ...

  4. promise处理多个相互依赖的异步请求

    在项目中,经常会遇到多个相互依赖的异步请求.如有a,b,c三个ajax请求,b需要依赖a返回的数据,c又需要a和b请求返回的数据.如果采用请求嵌套请求的方式自然是不可取的.导致代码难以维护,如何请求很 ...

  5. Treap详解

    今天一天怼了平衡树.深深地被她的魅力折服了.我算是领略到了高级数据结构的美妙.oi太神奇了. 今天初识平衡树,选择了Treap. Treap又叫树堆,是一个二叉搜索树.我们知道,它的节点插入是随机的, ...

  6. NOIP2000提高组 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  7. Selenium2 (python)

    包名:selenium 支持浏览器:Firefox,InternetExplorerDriver,OperaDriver,Chrome(要使用一种浏览器应下载相应的driver驱动) 一.基本命令 d ...

  8. python之--------封装

    一.封装: 什么是封装呢?(封装不是单纯意义的隐藏,其实它还是可以查看的) 就是把一些不想让别人看的给隐藏起来了 封装数据:目的是保护隐私 功能封装:目的是隔离复杂度 如果用了私有的,在类的外部,无法 ...

  9. 神经网络与深度学习笔记 Chapter 2.

    转载请注明出处http://www.cnblogs.com/zhangcaiwang/p/6886037.html 以前都没有正儿八经地看过英文类文档,神经网络方面又没啥基础,结果第一章就花费了我将近 ...

  10. Web 学习笔记 - 网络安全

    前言 作为 前端开发者,了解一点 Web 安全方面的基本知识是有很必要的,未必就要深入理解.本文主要介绍常见的网络攻击类型,不作深入探讨. 正文 网络攻击的形式种类繁多,从简单的网站敏感文件扫描.弱口 ...