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ó).
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ố.) –