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并不需要它).
getLocation()返回相对于父组件坐标空间的位置.这就是为什么item1.getLocation()总是返回相同的值,因为它总是在相对于弹出菜单的相同位置.
从阅读Javadoc看起来,调用mainFrame.getMousePosition()可以返回您正在寻找的点.
旧线程,但我最近有这个问题.这里的问题是在ActionPerformed调用期间,PopupMenu的可见性已经设置为false,这意味着它的位置不再被定义(即.(0,0)).我正在开发一个无鼠标界面,所以抓住鼠标的位置对我来说是不可能的.每次看到菜单时,我都会将菜单的位置存储起来并使用它来创建我的组件.
| 归档时间: |
|
| 查看次数: |
4970 次 |
| 最近记录: |