JPopupMenu в апплете Java3d не получает ввод с мыши или клавиатуры

У меня есть приложение Java, которое использует Java3D и JPopupMenus, заполненное JMenuItems. Все работает нормально, когда оно работает как обычное приложение - JPopupMenus и все остальное ведут себя так, как ожидалось. Однако, когда я делаю апплет из приложения, JPopupMenu, полностью всплывающее поверх Canvas3D, не работает должным образом. JPopupMenu ведет себя следующим образом:

  1. Пункты меню не выделяются при наведении на них указателя мыши.
  2. Клавиши со стрелками не могут использоваться для перемещения по пунктам меню.
  3. Щелчок по JMenuItem верхнего уровня завершает действие и выделяет элемент, но не удаляет JPopupMenu, как в обычном приложении.
  4. Щелчок по JMenuItem верхнего уровня, который содержит подменю, ничего не делает
  5. Щелчок за пределами JPopupMenu не удаляет JPopupMenu, как в обычном приложении.
  6. При отображении JPopupMenu открытие JPopupMenu поверх качающейся части моей программы обеспечивает обычное и ожидаемое поведение JPopupMenu над Canvas3D, но пункт 5 все еще применяется.

Еще немного информации:

  • JPopupMenu отображается с помощью JPopupMenu.show() по отношению к JPanel, содержащему Canvas3D.
  • Я вызываю JPopupMenu.setDefaultLightWeightPopupEnabled(false) перед созданием любого JPopupMenus, но эта строка, похоже, не имеет значения.
  • Я думал, что это может быть проблема с фокусом, но JPopupMenu.requestFocusInWindow() не работает

Итак, мой вопрос: что вызывает различие в поведении между приложением и апплетом, и как я могу заставить JPopupMenu в апплете функционировать так же, как в приложении?


person maher.cs    schedule 19.06.2012    source источник


Ответы (2)


Вы должны изменить легкий JPopup на тяжелый, чтобы говорить что-то еще, не публикуя свой SSCCE.

person mKorbel    schedule 19.06.2012
comment
JPopupMenu.setDefaultLightWeightPopupEnabled(false) должен сделать все JPopupMenus, созданные после этого вызова, тяжеловесными. Кроме того, я буду работать над SSCCE, но для базовой реализации требуется много кода, и я чувствую, что это, вероятно, больше концептуальный вопрос, поскольку настольное приложение работает нормально, и ломается только апплет. . - person maher.cs; 19.06.2012
comment
@maher.cs Насколько я знаю, все хорошие обходные пути для CAD/CAM, 3D и т. д. основаны на AWT, возможно, вам придется использовать всплывающее окно AWT с Swing JMenuItem или ei, смешивая тяжелый контейнер с легкими JComponents, вы можете проверить это с помощью GlassPane ( установите для BorderLayout и поместите туда непрозрачный JLabel с некоторой прозрачностью Background и Aplpha), если позади будет GlassPane, то вы должны использовать всплывающие контейнеры AWT без исключений - person mKorbel; 19.06.2012
comment
Сейчас я работаю над тестированием, но разве JPopupMenu вообще не появлялся бы, если бы он был легким? Canvas3D тяжеловесен, поэтому я ожидаю, что JPopupMenu вообще не увидит, согласно java.sun.com/products/jfc/tsc/articles/mixing. - person maher.cs; 19.06.2012
comment
Переключение всего на AWT помогло. Спасибо, что предложили этот путь. - person maher.cs; 19.06.2012
comment
рад помочь вам, ээээхммм правда ... я возился с этим больше недели - person mKorbel; 19.06.2012

Я решил, установив вызывающий элемент в JPopMenu и сделав его HeavyWeight.

final JPopupMenu popup = new JPopupMenu();
popup.setLightWeightPopupEnabled(false);
popup.setInvoker(myJFrame);
person Enrico Scantamburlo    schedule 08.06.2013