2009-05-18 44 views
5

Tôi gặp sự cố khi nhận được JPopupMenu 's vị trí.Nhận vị trí của JPopupMenu

Những gì tôi cần là để có thể kích chuột phải vào khu vực làm việc, bấm một số
mục trình đơn, và sau đó tạo ra một yếu tố tại chỗ ngay dưới vị trí của menu hiển thị trước đó.

tôi đã cố gắng nhận được vị trí của menu chính nó và các hạng mục của nó,
nhưng nó mang lại cho tôi giá trị không đổi khoảng 0. (xem chú thích trong code)

Do tách mối quan tâm , trình đơn được hiển thị trong một lớp
trong khi các hành động của nó được xử lý trong một hành động khác.

public final class MainFrameMenu 
    extends JPopupMenu 
    implements ActionListener { 

    private final MainFrame mainFrame; 
    private final JMenuItem item1 = new JMenuItem("add line"); 
    private final JMenuItem item2 = new JMenuItem("add element"); 

    public MainFrameMenu(MainFrame mainFrame) { 
    super("Main menu"); 
    this.mainFrame = mainFrame; 

    item1.addActionListener(this); 
    item2.addActionListener(this); 

    add(item1); 
    add(item2); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == item1) { 
     System.out.println(getLocation()); // gives ALWAYS [0, 0] 
     System.out.println(item1.getLocation()); // gives ALWAYS [1, 3] 

     // I want to create an element IN PLACE 
     mainFrame.addConnectionLine(getX(), getY()); 
    } 
    } 

} 

public final class PopupMouseListener 
    extends MouseAdapter { 

    private final JPopupMenu menu; 

    public PopupMouseListener(JPopupMenu menu) { 
    this.menu = menu; 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
    popup(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    popup(e); 
    } 

    private void popup(MouseEvent e) { 
    if (e.isPopupTrigger()) { 
     menu.show(e.getComponent(), e.getX(), e.getY()); 
    } 
    } 

} 

Tôi biết tôi có thể lưu trữ các cuối cùng được biết đến vị trí trong PopupMouseListener, và đọc nó từ MainFrameMenu, nhưng nó sẽ làm hỏng lớp hệ thống phân cấp (hầu hết các sự cố khác của PopupMouseListener don' t cần nó).

Trả lời

5

getLocation() trả về vị trí liên quan đến không gian tọa độ của thành phần gốc. Đây là lý do tại sao item1.getLocation() luôn trả về cùng một giá trị vì nó luôn ở cùng một vị trí liên quan đến trình đơn bật lên.

Từ đọc Javadoc, có vẻ như gọi phương thức mainFrame.getMousePosition() có thể trả về điểm bạn đang tìm kiếm.

+0

Tất nhiên! Vị trí chuột !!! Nó hoạt động, cảm ơn bạn! - (BTW, getParent(). GetLocation() cũng trả về hằng số.) –

5

Chủ đề cũ, nhưng gần đây tôi gặp vấn đề này. Vấn đề ở đây là trong suốt cuộc gọi ActionPerformed, khả năng hiển thị của PopupMenu đã được đặt thành false, có nghĩa là vị trí của nó không còn được xác định (ví dụ. (0,0)). Tôi đang phát triển cho một giao diện vô giá trị, vì vậy việc nắm lấy vị trí của chuột là không thể đối với tôi. Tôi đã lưu trữ vị trí của trình đơn mỗi khi nó được hiển thị và sử dụng nó để tạo thành phần của tôi.

Các vấn đề liên quan