2012-01-17 13 views
5

Tengo un TrayIcon con un JPopupMenu se le atribuye. Cuando agregue un JMenuItem al menú emergente, quiero saber la dimensión de este menú emergente. Pero la dimensión no se calcula: getBounds(), getSize() y getVisibleRect() todos devuelven las dimensiones cero por cero.¿Cómo obtener la dimensión de un JPopupMenu?

Como puede ver en la imagen, el menú emergente ciertamente tiene una dimensión.
Tray Popup Menu
Ahora, ¿cómo puedo obtener la dimensión del menú emergente?

Respuesta

5

componentes no tienen un tamaño hasta que se hayan realizado. Lo que básicamente significa hasta que se hayan hecho visibles (o empacados).

Por qué es importante, el sistema se encarga de posicionar el menú? Si conocemos los requisitos, tal vez podamos brindar una mejor solución.

Si quiere un truco, intente utilizar PopupMenuListener y maneje el evento popupMenuWillBecomeVisible(). Luego deberá ajustar su código en SwingUtilities.invokeLater() para que el código se ejecute después de que el menú esté visible.

0

Estaba investigando esto porque quería usar un JPopupMenu para mi TrayIcon en lugar de un AWT PopupMenu. Como JPopupMenu no tiene pack(), el método de arriba funcionará, por supuesto. Si es sólo un menú sencillo y sin carga de gráficos pesados, se puede engañar al sistema, simplemente haciendo el menú visible durante un breve momento después de añadir los menús:
myjPop.setVisible(true);
myjPop.setVisible(false);
Después de esto usted tiene el tamaño del menú . No es la mejor solución, pero es simple y funciona.

0

Tengo otra solución a este problema. Puede llamar al método show() dos veces.

Después de llamar al método en primer lugar las propiedades de dimensión serán inicializados, la segunda vez que se muestran en el menú emergente en el lugar deseado. Aquí está un ejemplo:

Quiero ver el menú al lado del botón para hacer esto necesito saber el ancho de la PopMenu enter image description here

Si llamo menu.getWidth() en la primera vez que lo hará devuelve 0 después de la primera llamada devolverá el valor ocupado por el menú emergente;

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