在Java Swing中如何在JLabel上覆盖一个JButton?

5

在Swing中是否可以在标签上覆盖按钮?

例如,如果我有一个没有文本只有图像的JLabel,并且我想要将我的按钮覆盖在这个JLabel上。标签的定义类似于:

myLabel = new javax.swing.JLabel(new ImageIcon( myPicture ));  

如果不行,有什么想法可以实现这个功能吗?谢谢。
编辑:实际上我读到了关于将JPanel添加到JLabel中的方法,当我添加一个带有按钮布局的面板时,它可以编译通过,但是没有任何可见的东西,只有带有图像的JLabel。
更新:如@paranoid-android建议的那样,我已经解决了我的问题。然而,我仍然需要知道如何自定义覆盖在JLabel上的组件的位置,因为我没有太多控制(可能是因为我通常使用netbeans绘制布局,这需要硬编码)。
类似这样的东西可以工作:
ImagePanel(Image image, int id) {
    this.image = image;
    this.tile = false;

    JButton backButton = new JButton();
    JButton nextButton = new JButton();
    backButton.setText(" BACK ");
    nextButton.setText(" NEXT ");


    add(backButton);
    add(nextButton);

};

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
}

你是想创建一个没有边框的JButton吗?还是一个可点击的JLabel? - Raceimaztion
@Raceimaztion,我有一个带有图像的JLabel,它被设置在一个无装饰边框的Frame中,这样在屏幕上你只能看到图像而没有任何边框或其他东西。现在我想通过将其他选项叠加在这个图像上来添加其他选项,也许我需要尝试使用面板中的图像,但我想知道我所要求的是否可行? - Johnydep
请回报哪些是有效的,哪些是无效的。 :) - rtheunissen
@paranoid-android,实际上我仍然被同样的问题困扰着。我重写了paintComponent方法,使用自己的图像绘制,甚至使用了null布局,但是要么我无法在其上添加另一个组件,要么其他组件是唯一可见的。分层面板与标准组件一起使用时效果很好,但是当我添加图像时,图像就会消失,我不知道该怎么办。 - Johnydep
请不要“添加”图片。能否贴一些代码?http://pastie.org - rtheunissen
小心将图像缩放到 JPanel 的宽度和高度(就像您在编辑中所做的那样)。这可能会导致背景看起来非常平庸。另一种选择是使用 TexturePaint,它可以平铺以适应空间,或具有固定大小的框架或图像。由您决定。 :) - rtheunissen
3个回答

9
您可以使用 JLayeredPane 来完成,不过如果我理解正确,最好的方法是覆盖 paintComponent 方法:
// as part of your JPanel
@Override
public void paintComponent(Graphics g){
     super.paintComponent(g);
     g.drawImage(background, 0, 0, this);
}

然后您可以随意向面板添加组件,而不需要使用JLabel


2

实际上我尝试过了,但是GridBagLayout并不真正允许重叠。 - Johnydep

0

感谢 rtheunissen。 这对我很有帮助。
我稍微修改了一下。

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
    try {
        ImageIcon icon =  new ImageIcon(getClass().getClassLoader().getResource("img/lake.jpeg"));        
        g.drawImage(icon.getImage(),0,0,this);

    } catch (Exception ex) {
        Logger.getLogger(InfoPanel.class.getName()).log(Level.SEVERE, null, ex);
    }            
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接