2012-01-17 28 views
5

我有一個TrayIconJPopupMenu連接到它。當我在彈出菜單中添加JMenuItem時,我想知道此彈出式菜單的尺寸。但尺寸不計算:getBounds(),getSize()getVisibleRect()都返回零維尺寸。如何獲得JPopupMenu的維度?

正如您在圖像中看到的那樣,彈出式菜單當然是具有的尺寸。
Tray Popup Menu
現在我怎樣才能得到彈出菜單的維度?

回答

5

元件在實現前沒有尺寸。這基本上意味着,直到他們已經可見(或包裝)。

爲什麼這很重要,系統在定位菜單後會看起來如何?如果我們知道需求,也許我們可以提供更好的解決方案。

如果您想要黑客,請嘗試使用PopupMenuListener並處理popupMenuWillBecomeVisible()事件。然後,您將需要將代碼包裝在SwingUtilities.invokeLater()中,以便在菜單可見後執行代碼。

0

我正在調查此問題,因爲我想使用JPopupMenu代替我的TrayIcon而不是AWT PopupMenu。 由於JPopupMenu沒有pack(),所以上面的方法當然會起作用。 如果它只是沒有繁重的圖形加載一個簡單的菜單,你可以添加菜單後欺騙系統,通過簡單地做了一個短暫的瞬間菜單可見:
myjPop.setVisible(true);
myjPop.setVisible(false);
之後,你有菜單的大小。這不是有史以來最好的解決方案,但它很簡單,並伎倆。

0

我對這個問題有另一種解決方案。你可以調用show()方法兩次。

首先調用該方法後,維度屬性將被初始化,第二次在所需的位置顯示彈出菜單。這裏有一個例子:

我想下一個顯示菜單的按鈕要做到這一點,我需要知道的寬度與popmenu enter image description here

如果我在第一時間致電menu.getWidth(),它會在第一次調用之後返回0,它將返回彈出菜單佔用的值;

int firstX = refreshButton.getLocation().x; 
int firstY = refreshButton.getLocation().y; 
menu.show(toolBar, firstX, firstY); 
menu.show(toolBar, firstX - menu.getWidth(), firstY);