1

我想在我的 JPanel 上创建弹出图像。

现在我有这样的事情:

在此处输入图像描述

但需要得到这样的东西:

在此处输入图像描述

它将在我按下 X1 之后。如何在 Java 中做到这一点?谢谢。

4

2 回答 2

2

作为一个起点,这样的事情可能对你有用。(非常迅速地放在一起,要温柔。)我认为 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);
    }

}
于 2012-10-09T22:23:36.693 回答
2

像这样创建菜单:

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 一个有趣的问题:)

于 2012-10-09T15:44:31.757 回答