Я сам сталкивался с этой проблемой при установке пользовательского JPopupMenu на JCommandButton.Для вашего JCommandButton я обнаружил, что это полезно для предотвращения преждевременного удаления родительского всплывающего окна:
this.putClientProperty(BasicCommandButtonUI.DONT_DISPOSE_POPUPS, true);
Если вместо этого вы выбираете JPopupMenu JMenuItem, родительская всплывающая панель остается открытойУ вас есть пара вариантов.Проблема связана с неработающей связью JPopupMenu в цепочке контейнеров предков, на которую опирается пользовательский интерфейс.Вместо getParent () вам нужно вернуть getInvoker ().
1:
изменить исходный код библиотеки в BasicPopupPanelUI.WindowTracker.eventDispatched ().Либо измените SwingUtilities .getAncestorOfClass (), чтобы использовать SwingXUtilities .getAncestorOfClass (), который учитывает этот особый случай.Или реализуйте логику самостоятельно.
if(parent instanceof JPopupMenu) parent = ((JPopupMenu)parent).getInvoker()
2:
Добавьте этот код в виджет (CustomButton?)
final JPopupMenu popper = new JPopupMenu(){ //hack
@Override public Container getParent(){
StackTraceElement ste = Thread.currentThread().getStackTrace()[2];
if(ste.getClassName().equals(SwingUtilities.class.getName()))
return CustomButton.this.getParent();
return super.getParent();
}
};
Я выбрал # 2, так как у меня естьпроблемы с изменением сторонних библиотек.