が付属していますTrayIcon
。JPopupMenu
ポップアップ メニューに を追加するときJMenuItem
、このポップアップ メニューのサイズを知りたいです。ただし、次元は計算されません:getBounds()
でgetSize()
あり、getVisibleRect()
すべて 0 行 0 列の次元を返します。
画像でわかるように、ポップアップ メニューには確かに次元があります。
ポップアップ メニューのサイズを取得するにはどうすればよいでしょうか。
が付属していますTrayIcon
。JPopupMenu
ポップアップ メニューに を追加するときJMenuItem
、このポップアップ メニューのサイズを知りたいです。ただし、次元は計算されません:getBounds()
でgetSize()
あり、getVisibleRect()
すべて 0 行 0 列の次元を返します。
画像でわかるように、ポップアップ メニューには確かに次元があります。
ポップアップ メニューのサイズを取得するにはどうすればよいでしょうか。
コンポーネントは実現されるまでサイズを持ちません。これは基本的に、それらが表示される (またはパックされる) までを意味します。
システムがメニューを配置した後、なぜこれが重要なのですか? 要件がわかれば、より良いソリューションを提供できるかもしれません。
ハックが必要な場合は、PopupMenuListener を使用して popupMenuWillBecomeVisible() イベントを処理してみてください。次に、メニューが表示された後にコードが実行されるように、コードを SwingUtilities.invokeLater() でラップする必要があります。
この問題には別の解決策があります。show() メソッドを 2 回呼び出すことができます。
最初にメソッドを呼び出した後、ディメンション プロパティが初期化され、2 回目に目的の場所にポップアップ メニューが表示されます。次に例を示します。
これを行うには、ボタンの横にメニューを表示したい popmenu の幅を知る必要があります
初めて 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);
AWT PopupMenu の代わりにJPopupMenu
for myを使用したかったので、これを調べていました。TrayIcon
JPopupMenu には がないためpack()
、上記のメソッドはもちろん機能します。グラフィックスの負荷が高くない単純なメニューの場合は、メニューを追加した後、メニューを少しの間だけ表示するだけで、システムをだますことができます
myjPop.setVisible(true);
myjPop.setVisible(false);
。この後、メニューのサイズが得られます。これはこれまでで最高のソリューションではありませんが、シンプルでうまく機能します。