Как получить размер JPopupMenu? - PullRequest
5 голосов
/ 17 января 2012

У меня есть TrayIcon с прикрепленным к нему JPopupMenu.Когда я добавляю JMenuItem во всплывающее меню, я хочу знать размер этого всплывающего меню.Но размерность не рассчитывается: getBounds(), getSize() и getVisibleRect() все возвращают нулевые измерения.

Как видно на рисунке, всплывающее меню, безусловно, имеет измерение.
Tray Popup Menu
Теперь, как я могу получить размер всплывающего меню?

Ответы [ 3 ]

5 голосов
/ 17 января 2012

Компоненты не имеют размера, пока они не будут реализованы. Что в основном означает, пока они не будут сделаны видимыми (или упакованными).

Почему это важно, система следит за позиционированием меню? Если мы знаем требование, возможно, мы сможем предложить лучшее решение.

Если вы хотите взломать, попробуйте использовать PopupMenuListener и обработать событие popupMenuWillBecomeVisible (). Затем вам нужно будет обернуть ваш код в SwingUtilities.invokeLater (), чтобы код выполнялся после того, как меню стало видимым.

0 голосов
/ 19 декабря 2013

У меня есть другое решение этой проблемы.Вы можете вызвать метод show () дважды.

После первого вызова метода будут инициализированы свойства измерения, во второй раз вы увидите всплывающее меню в нужном месте.Вот пример:

Я хочу отобразить меню рядом с кнопкой, чтобы сделать это, мне нужно знать ширину всплывающего меню enter image description here

Если я вызываю 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);
0 голосов
/ 26 марта 2013

Я изучал это, потому что я хотел использовать JPopupMenu для моего TrayIcon вместо AWT PopupMenu. Так как JPopupMenu не имеет pack(), описанный выше метод будет работать, конечно. Если это просто простое меню без большой графической нагрузки, вы можете обмануть систему, просто сделав меню видимым на короткое время после добавления меню:
myjPop.setVisible(true);
myjPop.setVisible(false);
После этого у вас есть размер меню. Это не самое лучшее решение, но оно простое и помогает.

...