java swing弹出图像

时间:2012-10-09 15:36:46

标签: java image swing popup

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

现在我有这样的事情:

enter image description here

但需要得到这样的东西:

enter image description here

在我按X1之后。 如何用Java做到这一点? 日Thnx。

2 个答案:

答案 0 :(得分: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上测试,但是,您可以通过浏览器打开图像并从浏览器地址栏中读取格式正确的路径。

EDIT ^ 2: 这个解决方案不适合您的需要,因为它看起来与您提供的图像不完全相同 - 气球图像将是一个菜单项,菜单将被看到。

EDIT ^ 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);
    }    

}

你几乎可以得到你想要的东西。请记住这是一个“黑客”(不是黑客,而是“黑客”) - 它是如何完成的。正确的方法是定制JPopUpMenuUI(可能与制作你自己的类的子类一起)。

我无法告诉你如何,但我知道我会learn一旦我有时间。另请参阅this

+1一个有趣的问题:)

答案 1 :(得分:2)

作为一个起点,这样的事情可能适合你。 (非常快速地放在一起,温柔。)我认为GlassPane方法将是最干净的。我将留给您在paintComponent()方法中的信息气泡上添加指针。

enter image description here

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);
    }

}