我正在尝试使用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());
}
});
答案 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);
因为弹出位置是相对于源的,所以我们不需要源的位置信息