2

我正在尝试通过 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());
            }
        });
4

2 回答 2

3

尝试传入你的窗口实例。(这)。

根据文档,第一个参数是

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

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

于 2012-07-23T01:44:40.790 回答
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);

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

于 2012-07-23T04:27:13.167 回答