左键单击弹出窗口

时间:2012-07-23 01:28:05

标签: java swing menu awt jpopupmenu

我正在尝试使用Java通过动作侦听器在按钮上创建一个弹出窗口。

我有一些代码,但我不能让它工作,虽然我觉得我很接近! 这段代码来自一个例子,但是对于Pmenu.show,我不得不删除第一个arg,我不知道要替换它,这似乎是这里的问题。

btnOptions.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                final JPopupMenu Pmenu = new JPopupMenu();
                  JMenuItem menuItem = new JMenuItem("Cut");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Copy");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Paste");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Delete");
                  Pmenu.add(menuItem);
                  menuItem = new JMenuItem("Undo");
                  Pmenu.add(menuItem);
                  Point location = MouseInfo.getPointerInfo().getLocation();
                  Pmenu.show(null, location.getX(), location.getY());
            }
        });

2 个答案:

答案 0 :(得分:3)

尝试传递窗口的实例。 (这个)。

根据documentation,第一个参数是

invoker - the component in whose space the popup menu is to appear

所以你想在窗口中显示弹出菜单。

答案 1 :(得分:2)

Component source = (Component)evt.getSource();
Point location = MouseInfo.getPointerInfo().getLocation();
SwingUtilities.convertPointFromScreen(location, source
Pmenu.show(source, location.getX(), location.getY());

跳出来的问题是“为什么?”为什么这样?你想要实现的是什么?

更新 - 弹出式偏移

这将显示水平居中于源控件(按钮)及其下方的弹出窗口。

Component source = (Component)evt.getSource();
Point location = source.getLocation();
Dimension size = source.getSize();

int xPos = location.x + ((size.width - PMenu.getWidth()) / 2;
int yPos = location.y + size.height;
Pmenu.show(source, xPos, yPos);

这当然只是一个例子,您可以随意提供布局信息

正在进行更新

    Component source = (Component)evt.getSource(); 
    Dimension size = source.getSize(); 

    int xPos = ((size.width - Pmenu.getPreferredSize().width) / 2); 
    int yPos = size.height;

    Pmenu.show(source, xPos, yPos);

因为弹出位置是相对于源的,所以我们不需要源的位置信息