我在JCommandButton上安裝自定義JPopupMenu時遇到了這個問題。 爲了您JCommandButton我發現這是有幫助防止過早處置父彈出的:
this.putClientProperty(BasicCommandButtonUI.DONT_DISPOSE_POPUPS, true);
如果你正在尋找的是而不是在製作的JPopupMenu JMenuItem的選擇,家長彈出面板將繼續開放,你有幾個選項。問題源於JPopupMenu在祖先容器鏈中的斷開鏈接,UI依賴於該鏈接。而不是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,因爲我有修改的第三方庫的問題。
@ Boro +1但嗯(對於期貨讀者)如何告訴你可敬的,更好的...你完全忽略了主要方法中的EDT,以及關於LayeredPane的例子* * * * * PrefferedSize容器的孩子,編輯,並把那裏的圖標+按鈕首選大小+10爲優秀的輸出到GUI,如果你編輯,那麼這個評論可以刪除:-) – mKorbel 2011-04-30 23:16:06
@mKorbel感謝您的評論。我對編程一個簡單的解決方案/例子時懶惰解釋了我對EDT的無知(當構建GUI時)。代碼已被編輯。我將從現在開始嘗試在每個示例中添加SwingUtilities.invokeLater()。順便說一句,當GUI構建忽略EDT會導致一個簡單例子的問題時,我從來沒有看到過問題。爲了解釋爲什麼我使用setPreferredSize()作爲滾動窗格,請參閱我的答案下的注2。 PS:不需要刪除你的評論---它將被用作提醒。 – Boro 2011-04-30 23:37:26
「順便說一句,當GUI構建忽略EDT的時候,我從來沒有遇到過任何問題」1 /是直到/然後你會嘗試使用一些原始的L&F,也不是Custom,2/one(一次)(你希望你)userPower不是0.6 T但6T,然後任何新手可以採取這一個作爲編碼標準,3/<:-)>一些人在這裏不會採取setSize()就像懶惰 – mKorbel 2011-05-01 00:03:34