2012-01-17 40 views
5

Ho un TrayIcon con un JPopupMenu collegato ad esso. Quando aggiungo un JMenuItem al menu popup, voglio conoscere la dimensione di questo menu popup. Ma la dimensione non viene calcolata: getBounds(), getSize() e getVisibleRect() tutte restituiscono quote zero per zero.Come ottenere la dimensione di un JPopupMenu?

Come si può vedere nell'immagine, il menu popup sicuramente ha una dimensione pari a.
Tray Popup Menu
Ora come posso ottenere la dimensione del menu popup?

risposta

5

I componenti non hanno una dimensione finché non sono stati realizzati. Il che significa sostanzialmente fino a quando non sono stati resi visibili (o confezionati).

Perché è importante, il sistema si occupa della posizione del menu? Se conosciamo il requisito forse possiamo fornire una soluzione migliore.

Se si desidera un trucco, provare a utilizzare PopupMenuListener e gestire l'evento popupMenuWillBecomeVisible(). Quindi dovrai avvolgere il tuo codice in SwingUtilities.invokeLater() in modo che il codice venga eseguito dopo che il menu è visibile.

0

Stavo cercando questo perché volevo usare un JPopupMenu per il mio TrayIcon invece di un PopupMenu AWT. Poiché un JPopupMenu non ha pack(), il metodo sopra funzionerà ovviamente. Se è solo un semplice menu senza carico pesante grafica, è possibile ingannare il sistema, rendendo semplice il menu visibile per un breve momento, dopo aver aggiunto i menu:
myjPop.setVisible(true);
myjPop.setVisible(false);
Dopo questo si ha la dimensione del menu . Non è la soluzione migliore di sempre, ma è semplice e fa il trucco.

0

Ho un'altra soluzione a questo problema. Puoi chiamare il metodo show() due volte.

Dopo aver chiamato il metodo, le proprietà della dimensione verranno inizializzate, la seconda volta che si visualizza il menu popup nella posizione desiderata. Ecco un esempio:

voglio visualizzare il menu accanto al pulsante per fare questo ho bisogno di sapere la larghezza al PopMenu enter image description here

Se chiamo menu.getWidth() in un primo tempo lo farà restituisce 0 dopo la prima chiamata restituirà il valore acquisito dal menu popup;

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