JCommandButton にカスタム JPopupMenu をインストールするときに、この問題に遭遇しました。あなたの JCommandButton については、これが親ポップアップの時期尚早な破棄を防ぐのに役立つことがわかりました:
this.putClientProperty(BasicCommandButtonUI.DONT_DISPOSE_POPUPS, true);
代わりに、JPopupMenu JMenuItem を選択したときに、親ポップアップ パネルが開いたままになることを求めている場合は、いくつかのオプションがあります。この問題は、UI が依存する祖先コンテナー チェーン内の 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 を選択しました。