5

我有TrayIcon一个JPopupMenu附在它上面的。当我在弹出菜单中添加 aJMenuItem时,我想知道这个弹出菜单的维度。但未计算维度:getBounds()getSize()并且getVisibleRect()都返回零乘零维度。

正如您在图像中看到的,弹出菜单当然一个维度。
托盘弹出菜单
现在我怎样才能得到弹出菜单的尺寸?

4

3 回答 3

5

组件在实现之前没有大小。这基本上意味着直到它们变得可见(或包装)。

为什么这很重要,系统会在定位菜单后进行处理?如果我们知道需求,也许我们可以提供更好的解决方案。

如果您想要破解,请尝试使用 PopupMenuListener 并处理 popupMenuWillBecomeVisible() 事件。然后,您需要将代码包装在 SwingUtilities.invokeLater() 中,以便在菜单可见后执行代码。

于 2012-01-17T15:47:30.730 回答
0

我正在研究这个,因为我想使用 a JPopupMenufor myTrayIcon而不是 AWT PopupMenu。由于 JPopupMenu 没有pack(),因此上面的方法当然可以工作。如果它只是一个没有繁重图形负载的简单菜单,您可以欺骗系统,只需在添加菜单后让菜单可见一小会儿:
myjPop.setVisible(true);
myjPop.setVisible(false);
在此之后您就有了菜单的大小。这不是有史以来最好的解决方案,但它很简单并且可以解决问题。

于 2013-03-26T12:52:51.683 回答
0

我有另一个解决这个问题的方法。您可以调用 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);
于 2013-12-19T13:54:18.953 回答