【问题标题】:Getting JPopupMenu's Position获取 JPopupMenu 的位置
【发布时间】:2009-05-18 16:21:55
【问题描述】:

我无法获取 JPopupMenu 的职位

我需要的是能够右键单击工作区,单击一些
菜单项,然后在之前显示的菜单位置的正下方就地创建一个元素。

我尝试获取菜单本身及其项目的位置,
但它给了我常数值 0 左右。(参见代码中的 cmets)

由于关注点分离,菜单显示在一个类中
而它的动作由另一个处理。

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

}

我知道我可以将最后已知位置存储在PopupMouseListener中, 并从 MainFrameMenu 中读取它,但它会破坏类 层次结构(大多数其他出现的 PopupMouseListener 不需要它)。

【问题讨论】:

    标签: java user-interface swing usability


    【解决方案1】:

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

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

    【讨论】:

    • 当然!鼠标位置!!!它有效,谢谢! - (顺便说一句,getParent().getLocation() 也返回常量。)
    【解决方案2】:

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

    【讨论】:

    • “每次显示菜单时存储菜单的位置”听起来很聪明。也许可以通过分享几行相关代码来改进答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多