我想在我的 JPanel 上创建弹出图像。
现在我有这样的事情:
但需要得到这样的东西:
它将在我按下 X1 之后。如何在 Java 中做到这一点?谢谢。
作为一个起点,这样的事情可能对你有用。(非常迅速地放在一起,要温柔。)我认为 GlassPane 方法将是最干净的。我将留给您在paintComponent()
方法中的信息气泡上添加一个指针。
static MyInfoBubble lastBubble;
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(new Dimension(500, 500));
JPanel glassPane = new JPanel();
glassPane.setOpaque(false);
glassPane.setLayout(null);
frame.setGlassPane(glassPane);
frame.getGlassPane().setVisible(true);
JPanel labelRowPanel = new JPanel();
for (int ctr = 0; ctr < 7; ctr++) {
labelRowPanel.add(makeButton(frame, "Button " + ctr));
}
frame.getContentPane().add(labelRowPanel);
frame.setVisible(true);
}
private static JButton makeButton(final JFrame frame, final String label) {
final JButton button = new JButton(label);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0)
{
if (lastBubble != null)
{
lastBubble.setVisible(false);
((JPanel)frame.getGlassPane()).remove(lastBubble);
lastBubble = null;
}
Point loc = button.getLocation();
MyInfoBubble mib = new MyInfoBubble();
mib.setBounds(loc.x+10, loc.y+30, 100, 50);
((JPanel)frame.getGlassPane()).add(mib);
lastBubble = mib;
((JPanel)frame.getGlassPane()).validate();
((JPanel)frame.getGlassPane()).repaint();
}
});
return button;
}
static class MyInfoBubble extends JPanel
{
public MyInfoBubble()
{
setVisible(true);
}
public void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.BLUE);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
}
}
像这样创建菜单:
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:
我会给你一个快速的技巧,而不是实例化 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(可能与创建您自己的该类的子类一起使用)。
我不能告诉你怎么做,但我知道我一有时间就会学会。也看到这个。
+1 一个有趣的问题:)