获得JPopupMenu的位置

iva*_*off 5 java usability user-interface swing

我在找到JPopupMenu位置时遇到了麻烦.

我需要的是能够右键单击工作区,点击一些
菜单项,然后创建一个元素来代替正确的先前显示的菜单的位置下.

我试着获取菜单本身及其项目的位置,
但它给了我大约0的常量值.(参见代码中的注释)

由于关注点分离,菜单显示在一个类中,
而其操作在另一个类中处理.

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());
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

我知道我可以存储最后已知位置PopupMouseListener,并从阅读MainFrameMenu,但它会破坏类层次结构(多数其他事件PopupMouseListener并不需要它).

Mar*_*ark 6

getLocation()返回相对于父组件坐标空间的位置.这就是为什么item1.getLocation()总是返回相同的值,因为它总是在相对于弹出菜单的相同位置.

从阅读Javadoc看起来,调用mainFrame.getMousePosition()可以返回您正在寻找的点.


nfw*_*nfw 5

旧线程,但我最近有这个问题.这里的问题是在ActionPerformed调用期间,PopupMenu的可见性已经设置为false,这意味着它的位置不再被定义(即.(0,0)).我正在开发一个无鼠标界面,所以抓住鼠标的位置对我来说是不可能的.每次看到菜单时,我都会将菜单的位置存储起来并使用它来创建我的组件.