5

Is it possible to overlay a Button over a Label in Swing?

For example, if have a JLabel with image and no text, and i want to overlay my button over this JLabel. Label is defined something like:

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

If not, then any ideas how can i realize this, thank you.

EDIT: Actually i read about adding JPanel to a JLabel, when i add a Panel with button layout, it compiles fine but nothing is visible, just the JLabel with image

UPDATE: As suggested by @paranoid-android, somehow i have solved my problem. However i still have to know how can i customize the positions of components overlayed on top of JLabel as i don't have much control (probably because normally i use netbeans for drawing layouts, and this would require hard coding).

Something Like this worked:

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);
}
Johnydep
  • 6,027
  • 20
  • 57
  • 74
  • Are you trying to create a JButton with no borders? Or a clickable JLabel? – Raceimaztion Feb 04 '12 at 00:50
  • @Raceimaztion, i have JLabel with Image set in a Undecorated Frame, so that on screen you only see the image without any border or anything. Now i want to add other options by overlaying them on top of this image, may be i need to try with image in a Panel, but i wanted to know is this something realizable what i have asked? – Johnydep Feb 04 '12 at 00:54
  • Report back what works and what doesn't, please. :) – rtheunissen Feb 04 '12 at 03:24
  • @paranoid-android, actually i am still stuck with the same problem. Overriding paintComponent, i draw image with my own image, even used null layout, but then again either i can not add another component over it or the other component is the only one that remains visible. Layered Pane works fine with standard components, but when i add image, img just disappears, i have no clue what can i do. – Johnydep Feb 04 '12 at 03:29
  • Don't `add` the image. Post some code please? http://pastie.org – rtheunissen Feb 04 '12 at 03:31
  • Careful with scaling your image to the width and the height of your `JPanel` (as you're doing in your edit). This can lead to really average looking background. An alternative to this would be `TexturePaint`, which would tile to fit the space, or have a fixed size frame, or a fixed size image. Up to you. :) – rtheunissen Feb 05 '12 at 04:06

3 Answers3

9

You can do it using a JLayeredPane, although if I understand correctly, the absolute best way to do that would be to override paintComponent:

// as part of your JPanel
@Override
public void paintComponent(Graphics g){
     super.paintComponent(g);
     g.drawImage(background, 0, 0, this);
}

Then you can add components to the panel as you like, without the need for the JLabel.

rtheunissen
  • 7,347
  • 5
  • 34
  • 65
2

You can overlap the button and the label, but you would have to do this with a Fixed Layout. You might be able to pull if off with a gridBagLayout, but I doubt it.

Here is more on what you will need.

http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Zeveso
  • 1,274
  • 3
  • 21
  • 41
0

Thanks rtheunissen. That did the trick for me.
I modified it a little.

@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);
    }            
}
Trev
  • 1
  • 2