gpt4 book ai didi

java - 获取 JPopupMenu 的位置

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:55 27 4
gpt4 key购买 nike

我无法获得 JPopupMenu 的位置

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

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

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

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 不需要它)。

最佳答案

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

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

关于java - 获取 JPopupMenu 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com