我有一个TrayIcon
附加JPopupMenu
。当我在弹出菜单中添加JMenuItem
时,我想知道这个弹出菜单的尺寸。但是不计算维度:getBounds()
,getSize()
和getVisibleRect()
都返回归零维度。
正如您在图片中看到的,弹出菜单肯定具有尺寸
现在我如何获得弹出菜单的尺寸?
答案 0 :(得分:5)
组件在实现之前没有大小。这基本上意味着它们被显示(或打包)。
为什么这很重要,系统会定位菜单?如果我们知道要求,我们可以提供更好的解决方案。
如果你想要一个hack,那么尝试使用PopupMenuListener并处理popupMenuWillBecomeVisible()事件。然后,您需要将代码包装在SwingUtilities.invokeLater()中,以便在菜单可见后执行代码。
答案 1 :(得分:0)
我正在研究这个因为我想使用JPopupMenu
代替我的TrayIcon
代替AWT PopupMenu。
由于JPopupMenu没有pack()
,因此上面的方法当然会起作用。
如果它只是一个没有大量图形加载的简单菜单,您可以通过简单地在添加菜单后短时间显示菜单来欺骗系统:
myjPop.setVisible(true);
myjPop.setVisible(false);
在此之后,你有菜单的大小。
它不是有史以来最好的解决方案,但它很简单并且可以解决问题。
答案 2 :(得分:0)
我有另一个解决这个问题的方法。你可以两次调用show()方法。
首先调用方法后,将初始化维度属性,第二次在所需位置显示弹出菜单。这是一个例子:
我想显示按钮旁边的菜单来执行此操作我需要知道popmenu的宽度
如果我在第一次调用后第一次调用menu.getWidth(),它将返回弹出菜单中显示的值;
int firstX = refreshButton.getLocation().x;
int firstY = refreshButton.getLocation().y;
menu.show(toolBar, firstX, firstY);
menu.show(toolBar, firstX - menu.getWidth(), firstY);