2010-10-04 1 views
1

Когда я разрешаю всплывать JPopupMenu без передачи «компонента invoker», меню не работает: подменю не открывается и не перерисовывается. Но когда я создаю абсолютно бесполезный JFrame с JLabel внутри, и я передаю JLabal как invoker, он работает правильно ...Java: Показать JPopupMenu без передачи компонента invoker

Любые предложения, как избежать создания бесполезного кадра. И у моего приложения действительно нет открытых фреймов, просто нужно выскочить простое меню.

JPopupMenu.show(null, xOnTheScreen, yOnTheScreen); // Doesn't work 
JPopupMenu.show(aStupidJLabelInAStupidJFrame, x, y); // Works 

Благодаря

+1

Ваше приложение для качания должно быть в каком-то JPanel, по крайней мере. Не так ли? –

+0

Если вы используете всплывающее меню в качестве всплывающего окна для значка рабочего стола, у вас не будет компонента, который будет использоваться для параметра invoker. Я помню, что у меня была аналогичная проблема. – Durandal

ответ

1

Посмотрите на JPopupMenu исходный код, и вы увидите, почему вы должны установить Invoker.

Отображать всплывающее меню без какого-либо существующего компонента было бы очень плохой юзабилити, в той же лиге, что и всплывающие окна из браузера.

Почему вы не можете использовать JComponent#setComponentPopupMenu или добавить прослушиватель мыши к компоненту, в котором вы хотите отображать всплывающее меню?

+0

Я уже заглянул в код, но не могу понять, почему ... –

+0

Поиск 'JPopupMenu # getInvoker' в JDK6 вы увидите целую кучу ссылок. Это не очень хорошая идея, чтобы изменить такое основное поведение и предположение. –