我有TrayIcon
一个JPopupMenu
附在它上面的。当我在弹出菜单中添加 aJMenuItem
时,我想知道这个弹出菜单的维度。但未计算维度:getBounds()
,getSize()
并且getVisibleRect()
都返回零乘零维度。
正如您在图像中看到的,弹出菜单当然有一个维度。
现在我怎样才能得到弹出菜单的尺寸?
我有TrayIcon
一个JPopupMenu
附在它上面的。当我在弹出菜单中添加 aJMenuItem
时,我想知道这个弹出菜单的维度。但未计算维度:getBounds()
,getSize()
并且getVisibleRect()
都返回零乘零维度。
正如您在图像中看到的,弹出菜单当然有一个维度。
现在我怎样才能得到弹出菜单的尺寸?
组件在实现之前没有大小。这基本上意味着直到它们变得可见(或包装)。
为什么这很重要,系统会在定位菜单后进行处理?如果我们知道需求,也许我们可以提供更好的解决方案。
如果您想要破解,请尝试使用 PopupMenuListener 并处理 popupMenuWillBecomeVisible() 事件。然后,您需要将代码包装在 SwingUtilities.invokeLater() 中,以便在菜单可见后执行代码。
我正在研究这个,因为我想使用 a JPopupMenu
for myTrayIcon
而不是 AWT PopupMenu。由于 JPopupMenu 没有pack()
,因此上面的方法当然可以工作。如果它只是一个没有繁重图形负载的简单菜单,您可以欺骗系统,只需在添加菜单后让菜单可见一小会儿:
myjPop.setVisible(true);
myjPop.setVisible(false);
在此之后您就有了菜单的大小。这不是有史以来最好的解决方案,但它很简单并且可以解决问题。
我有另一个解决这个问题的方法。您可以调用 show() 方法两次。
在您第一次调用该方法后,维度属性将被初始化,第二次您在所需位置显示弹出菜单。这是一个例子:
我想在按钮旁边显示菜单来做到这一点我需要知道弹出菜单的宽度
如果我第一次调用 menu.getWidth() 它将在第一次调用后返回 0 它将返回弹出菜单占用的值;
int firstX = refreshButton.getLocation().x;
int firstY = refreshButton.getLocation().y;
menu.show(toolBar, firstX, firstY);
menu.show(toolBar, firstX - menu.getWidth(), firstY);