2012-01-17 24 views
5

Tôi có một số TrayIcon với số JPopupMenu được đính kèm với nó. Khi tôi thêm JMenuItem vào menu bật lên, tôi muốn biết thứ nguyên của menu bật lên này. Nhưng thứ nguyên không được tính: getBounds(), getSize()getVisibleRect() tất cả các thứ nguyên không bằng không.Làm thế nào để có được kích thước của một JPopupMenu?

Như bạn có thể thấy trong hình ảnh, menu bật lên chắc chắn thứ nguyên.
Tray Popup Menu
Bây giờ làm cách nào tôi có thể nhận được thứ nguyên của menu bật lên?

Trả lời

5

Các thành phần không có kích thước cho đến khi chúng được nhận ra. Mà về cơ bản có nghĩa là cho đến khi chúng đã được hiển thị (hoặc đóng gói).

Tại sao điều này quan trọng, hệ thống trông sau khi định vị menu? Nếu chúng ta biết yêu cầu, chúng ta có thể cung cấp một giải pháp tốt hơn.

Nếu bạn muốn hack, hãy thử sử dụng PopupMenuListener và xử lý sự kiện popupMenuWillBecomeVisible(). Sau đó, bạn sẽ cần phải quấn mã của bạn trong một SwingUtilities.invokeLater() để mã thực thi sau khi trình đơn được hiển thị.

0

Tôi đã xem xét điều này vì tôi muốn sử dụng một số JPopupMenu cho số TrayIcon thay vì AWT PopupMenu của mình. Vì một JPopupMenu không có pack(), phương thức từ trên sẽ hoạt động. Nếu nó chỉ là một menu đơn giản mà không cần tải đồ họa nặng, bạn có thể đánh lừa hệ thống, bằng cách đơn giản làm menu có thể nhìn thấy trong một khoảnh khắc ngắn sau khi thêm các menu:
myjPop.setVisible(true);
myjPop.setVisible(false);
Sau này bạn phải kích thước của menu . Nó không phải là giải pháp tốt nhất bao giờ hết, nhưng nó đơn giản và làm các trick.

0

Tôi có giải pháp khác cho vấn đề này. Bạn có thể gọi phương thức show() hai lần.

Sau khi bạn gọi phương thức trước, các thuộc tính thứ nguyên sẽ được khởi tạo, lần thứ hai bạn hiển thị menu bật lên ở vị trí mong muốn. Dưới đây là một ví dụ:

Tôi muốn hiển thị menu bên cạnh nút để làm điều này tôi cần phải biết chiều rộng đến popmenu enter image description here

Nếu tôi gọi menu.getWidth() trong lần đầu tiên nó sẽ trả về 0 sau lần gọi đầu tiên nó sẽ trả về giá trị ocupied bởi menu popup;

int firstX = refreshButton.getLocation().x; 
int firstY = refreshButton.getLocation().y; 
menu.show(toolBar, firstX, firstY); 
menu.show(toolBar, firstX - menu.getWidth(), firstY); 
Các vấn đề liên quan