【发布时间】: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