# JPanel Transparent



## RedBulle (24. Jul 2009)

Hallo Leude
Ich hab folgendes Problem: Ich will ein Auf ein Hintergrundbild einige buttons und Labels anordnen, dazu möcht ich halt einige Panels auf mein Hintergrundbild setzen die Transparent sind und nur die Labels die auf dem Panel drauf liegen anzeigen. Im Moment zeigt er mir aber nur zwischen den Labels einen grauen Hintergrund an der über meinem Hintergrundbild drauf liegt.


```
public class Main {



    public static void main(String[] args) {
        Icon ic = new ImageIcon("bilder/voll.jpg");
        Icon is = new ImageIcon("bilder/exit.jpg");
        ImagePanel panel = new ImagePanel(new ImageIcon("bilder/bg.jpg").getImage());
        JFrame frame = new JFrame("Mein Testprogramm");
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocation(200, 100);
        JPanel x = new JPanel();
        JLabel L = new JLabel();
        JLabel L2 = new JLabel();
        x.setOpaque(false);
        x.add(L);
        x.add(L2);
        x.setLayout(new GridLayout(0,2));
        L.setIcon(ic);
        L2.setIcon(is);
        frame.add(x, BorderLayout.SOUTH);
    }

}
class ImagePanel extends JPanel {

  private Image img;
  public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
  }

  public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
  }

  public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }
}
```


----------



## Ebenius (24. Jul 2009)

Du legst das Panel [c]x[/c] nicht *über* das ImagePanel [c]panel[/c], sondern Du legst es im Süden an.


```
------------------------------------------------------
|                                                    |
|    ###                                             |
|    ###                                             |
|    ###                                             |
|    ###                                             |
|    ###  # ### ###    #####    #####    #####       |
|    ###  ### ### ##  ##   ##  ##   ##  ###  ##      |
|    ###  ##  ##  ##  ##   ##  ##   ##  ######       |
|    ###  ##  ##  ##  ##   ##  ##  ###  ###          |
|    ###  ##  ##  ##   #### ##  ### ##   ######      |
|                                   ##               |
|                               #####                |
|                                                    |
------------------------------------------------------
|           LABEL1       |  |       LABEL2           |
------------------------------------------------------
```
Unten ist gar kein Bild mehr und Du siehst die Farbe des Fensters durch.

Ebenius


----------



## RedBulle (24. Jul 2009)

ok danke für die schnelle antwort. Das klingt auch einleuchtend was du sagst. Aber ich muss ja meine labels/buttons irgendwie auf dem Bild anordnen. Wie mach ich dass dann? Kann ich die labels auf mein Imagepanel drauf legen und dann mit .setlocation ?? Kann ich mir nicht wirklich vorstellen.

EDIT: Inzwischen klappts, ein Freund konnte mir weiterhelfen. Für alle die per google oder SuFu hierhinfinden:
Die Override annotaiton die von Netbeans gefordert wurde bei Paintcomponent muss weg. Und dann tatsälich einfach die Labels zum panel hinzufügen und mit setlocation. Allerdings muss des Layout auf Null gesetzt werden und dann eben visible und setsize zu dem Label hinzugefügt werden:

```
public class Main {



       public static void main(String[] args) {
        Icon ic = new ImageIcon("bilder/voll.jpg");
        Icon is = new ImageIcon("bilder/exit.jpg");
        ImagePanel panel = new ImagePanel(new ImageIcon("bilder/bg.jpg").getImage());
        JFrame frame = new JFrame("Mein Testprogramm");
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setLocation(200, 100);
        JLabel L = new JLabel();
        JLabel L2 = new JLabel();
        panel.add(L);
        panel.add(L2);
        panel.setLayout(null);
        L.setLocation(200, 200);
        L.setVisible(true);
        L.setSize(ic.getIconWidth(), ic.getIconHeight());
        L.setIcon(ic);
        L2.setIcon(is);

    }

}
class ImagePanel extends JLayeredPane {

  private Image img;
  public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
  }

  public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
  }

    public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
  }
}
```


----------



## Ebenius (24. Jul 2009)

RedBulle hat gesagt.:


> Die Override annotaiton die von Netbeans gefordert wurde bei Paintcomponent muss weg.


Nein. Ab Java 5 sollte sie drin sein. Bis Java 1.4 (inkl.) gab es keine Annotations. Wenn die Annotation fehlt, ist das ungünstig; Begründungen hier: The Java™ Language Tutorial: Annotations (runter scrollen bis "Annotations used by the Compiler").



RedBulle hat gesagt.:


> Und dann tatsälich einfach die Labels zum panel hinzufügen und mit setlocation. Allerdings muss des Layout auf Null gesetzt werden und dann eben visible und setsize zu dem Label hinzugefügt werden


An sich richtig, aber [c]null[/c]-Layout ist immer schlecht. Schöner, wenn Du ein Layout benutzt, das das kann was Du möchtest. Am einfachsten geht es so:
[java=17]final JPanel southPanel = new JPanel(new GridLayout(1, 0));
southPanel.setOpaque(false);
southPanel.add(L);
southPanel.add(L2);
panel.setLayout(new BorderLayout(6, 6));
panel.add(southPanel, BorderLayout.SOUTH);[/code]
Ebenius


----------

