【问题标题】:java swing pop-up image [closed]java swing弹出图像[关闭]
【发布时间】:2012-10-09 15:36:46
【问题描述】:

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

现在我有这样的东西:

但需要得到这样的东西:

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

【问题讨论】:

  • 按X1,你的意思是,点击蓝色圆圈X1还是按X,然后按键盘上的1?也是 X1 图像还是 JButton 的子类或其他什么?
  • 点击 X1,X1 - 它是带有图标的 JLable。
  • 你可以使用 GlassPaneJLayer/JXLayer 之类的东西,但为了简单起见,我喜欢 JPopupMenu 的建议 ;)

标签: java image swing popup


【解决方案1】:

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

}

【讨论】:

    【解决方案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:

    我会给你一个快速的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 一个有趣的问题:)

    【讨论】:

    • 我得到了类似的东西:s017.radikal.ru/i408/1210/8f/b88723d1ae85.png 带有不可见的背景和边框...
    • 您想更改 Look And Feel ,而不是整个组件,而是特定组件。从来没有那样做,而且净资源稀缺。我目前正在尝试“破解”一些课程,如果我设法从中获得一些东西,我会更新..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多