像这样创建菜单:
JPopupMenu popupmenu = new JPopupMenu();
JMenuItem jMenuItem = new JMenuItem(new ImageIcon(getClass().getResource("/topmostpackage/sub/package/s/img.png")));
popupmenu.add(jMenuItem);
然后将点击处理程序添加到相关按钮并显示如下菜单:
MouseAdapter mouseAdapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
popupmenu.show(button, e.getXOnScreen(), e.getYOnScreen());
}
};
button.addMouseListener(mouseAdapter);
编辑:
要使上面的示例正常工作,您必须将图像放入您的包结构中,如果不是这样,您可以这样阅读:
URI uri = new URI("file:///home/linski/empty.png");
ImageIcon imageIcon = new ImageIcon(uri.toURL());
所以,在 file:// 之后,我将图像的路径放在我的 linux 文件系统上。我无法在 windows/mac 上测试,但是,您可以通过浏览器打开图像并从浏览器地址栏读取格式正确的路径。
编辑^2:
此解决方案无法满足您的需求,因为它看起来与您提供的图像不完全相同 - 气球图像将是一个菜单项,并且会看到该菜单。
编辑^3:
我会给你一个快速的hack,而不是实例化JPopupMenu,而是实例化这个类:
public class CustomPopUpMenu extends JPopupMenu {
@Override
protected void paintComponent(Graphics g) {}
}
而不是实例化 JMenuItem 实例化这个类:
public class CustomMenuItem extends JMenuItem {
public CustomMenuItem(Icon icon) {
super(icon);
}
@Override
protected void paintComponent(Graphics g) {
getIcon().paintIcon(this, g, 0, 0);
}
}
而且你会得到几乎你想要的。请记住,这是一个“hack”(不是 hack,而是“hack”)- 不是它的本意。正确的做法是自定义 JPopUpMenuUI(可能与创建您自己的该类的子类一起使用)。
我不能告诉你怎么做,但我知道我会尽快learn 它有时间。另见this。
+1 一个有趣的问题:)