# Bild in JLabel einfügen



## daeve (19. Apr 2011)

Hallo zusammen

ich bin an einem kleinen Projekt und habe das Problem das ich das Bild nicht angezeigt bekomme.
Das ganze erstelle ich mit Netbeans, das Bild sollte im JLabel(pictureHolder) angezeigt werden nur verstehe ich nicht warum nichts dargestellt wird.
Der Background wird Weiss wie er soll und das Bild liegt im gleichen Packet wie das GUI.


```
private JLabel pictureLabel;

    public final void gameBackground(){

      Icon picture = new ImageIcon("Spielfeld.jpg");
      pictureLabel = new JLabel(picture);
      pictureHolder.setBackground(Color.WHITE);
      pictureHolder.add(pictureLabel);
    }


    public GUI() {
        initComponents();
        gameBackground();

        
    }
```

könnt ihr mir einen Tipp geben warum nicht ausgegeben wird...


Danke und Gruss David


----------



## Marco13 (19. Apr 2011)

Was ist pictureHolder?
Mach' mal 
...  new JLabel("TEST");
Wenn das dann angezeigt wird, findet er vermutlich das Bild nicht - dann nochmal Pfade überprüfen.


----------



## daeve (19. Apr 2011)

Marco13 hat gesagt.:


> Was ist pictureHolder?
> Mach' mal
> ...  new JLabel("TEST");
> Wenn das dann angezeigt wird, findet er vermutlich das Bild nicht - dann nochmal Pfade überprüfen.



Der pictureHolder ist ein JPanel, das habe ich im Design Modus hineingezogen und umbenennt.

auch TEST wird nicht angezeigt, das eigenartige ist das der "pictureHolder.setBackground(Color.WHITE);" funktioniert...


----------



## Marco13 (19. Apr 2011)

Hm... Designmodus... Es gibt praktisch keinen LayoutManager, bei dem das Label nicht angezeigt werden würde, aber ... schau' mal nach, welchen LayoutManager es hat (nur aus neugier) oder probier mal
holderDingens.setLayout(new GridLayout(1,1));


----------



## daeve (20. Apr 2011)

Marco13 hat gesagt.:


> Hm... Designmodus... Es gibt praktisch keinen LayoutManager, bei dem das Label nicht angezeigt werden würde, aber ... schau' mal nach, welchen LayoutManager es hat (nur aus neugier) oder probier mal
> holderDingens.setLayout(new GridLayout(1,1));



es ist im FREE Layout aber geht auch nicht mit flow.. oder so

die paint methode funktioniert, aber überdeckt mir dann die Buttons und Menu`s



```
@Override
    public void paint(Graphics g){
        try {
            BufferedImage a = ImageIO.read(this.getClass().getResource("VierGewinntSpielfeld.jpg"));
            Image image = a;
            g.drawImage(image,0, 100, this);


        } catch (IOException ex) {
            Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
```

danke, für deine hilfe


----------



## daeve (20. Apr 2011)

wenn ich: setLayout(new GridLayout(1,1));  benutze bekomme ich den Background nicht mehr weiss, sondern bleibt auf standard Grau.


----------



## Michael... (20. Apr 2011)

Bei Swing überschreibt man paintComponent. paint macht nämlich noch ein bisschen mehr und ruft u.a. paintChildren und paintBorder auf. Daher die "überdeckten" Buttons usw.

Ein bisschen mehr Code oder besser noch ein KSKB wäre nicht schlecht, um das Problem einzugrenzen.


----------



## daeve (20. Apr 2011)

Michael... hat gesagt.:


> Bei Swing überschreibt man paintComponent. paint macht nämlich noch ein bisschen mehr und ruft u.a. paintChildren und paintBorder auf. Daher die "überdeckten" Buttons usw.
> 
> Ein bisschen mehr Code oder besser noch ein KSKB wäre nicht schlecht, um das Problem einzugrenzen.



danke für deine Antwort, aber was ist ein KSKB ?   da ich mit Swing keine grosse erfahrungen habe ist es nicht selbstverständlich für mich


----------



## L-ectron-X (20. Apr 2011)

Diesen Begriff hat mal André Uhres hier im Forum geprägt. Ein KSKB ist ein kurzes, selbstständiges, kompilierbares Beispiel.
Wenn du mit der Maus mal über das Kürzel fährst, wird dir die Bedeutung angezeigt. Für den IE wird das Kürzel nicht hervorgehoben, so dass man gar nicht mitbekommt, das dafür eine Beschreibung hinterlegt ist.
[EDIT]Wurde nun aber nachgepflegt.[/EDIT]


----------



## Marco13 (20. Apr 2011)

Aaahh, ja, die paint ist falsch: 
Erstens überschreibt man i.a. nicht paint, sondern paintComponent.
Zweitens sollte man in der paint/paintComponent NICHT ein Bild laden. Dort sollte NUR gezeichnet werden. Das Bild kann man z.B. im Konstruktor laden, und in der paintComponent dann zeichnen.
Drittens muss die erste Zeile einer überschriebenen paint- oder paintComponent-Methode fast immer der super-Aufruf sein:

```
@Override
    protected void paintComponent(Graphics g){
        [b]super.paintComponent(g);[/b]

        g.drawImage(...);
    }
```

EDIT: Äh... nur um das karzustellen: Du malst dort ein Bild von Hand, aber willst _zusätzlich_ das ImageIcon anzeigen...? ???:L Sieht komisch aus...


----------



## daeve (20. Apr 2011)

Marco13 hat gesagt.:


> Aaahh, ja, die paint ist falsch:
> Erstens überschreibt man i.a. nicht paint, sondern paintComponent.
> Zweitens sollte man in der paint/paintComponent NICHT ein Bild laden. Dort sollte NUR gezeichnet werden. Das Bild kann man z.B. im Konstruktor laden, und in der paintComponent dann zeichnen.
> Drittens muss die erste Zeile einer überschriebenen paint- oder paintComponent-Methode fast immer der super-Aufruf sein:
> ...



hehe, nein die paint methode ist die andere Variante die zur Auswahl steht. Verwendet wird dann nur eine.

Ich versuche das mit der paint mal noch.

gruss David


----------



## Marco13 (20. Apr 2011)

Ah, das 
"die paint methode funktioniert, aber überdeckt mir dann die Buttons und Menu`s"
hatte ich übersehen. Wenn das Bild im Hintergrund sein soll, könntest du die paint-Methode passend überschreiben, aber eigentlich sollte das mit dem ImageIcon schon gehen.


----------



## daeve (20. Apr 2011)

Hier habe ich mal ein KSKB  ist die gleiche aufstellung...

Das Bild liegt in dem selben *Package *wie die Klasse *NewJFrame*


```
package testswing;

import java.awt.Color;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;


public class NewJFrame extends javax.swing.JFrame {

    private JLabel pictureLabel;

    public final void gameBackground(){

            Icon picture = new ImageIcon("VierGewinntSpielfeld.jpg");
            pictureLabel = new JLabel(picture);
            jPanelInFrame.setBackground(Color.WHITE);
            jPanelInFrame.add(pictureLabel);
        

    }

  
    public NewJFrame() {
        initComponents();
        gameBackground();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanelInFrame = new javax.swing.JPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout jPanelInFrameLayout = new javax.swing.GroupLayout(jPanelInFrame);
        jPanelInFrame.setLayout(jPanelInFrameLayout);
        jPanelInFrameLayout.setHorizontalGroup(
            jPanelInFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 511, Short.MAX_VALUE)
        );
        jPanelInFrameLayout.setVerticalGroup(
            jPanelInFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 427, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanelInFrame, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanelInFrame, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JPanel jPanelInFrame;
    // End of variables declaration

}
```


----------



## Marco13 (21. Apr 2011)

OK... hat es einen bestimmten Grund, warum du dieses GUI-Builder-Ding verwendest? Irgendwas scheint bei dem jPanelInFrameLayout schiefzugehen, und was genau so Zeilen wie

```
jPanelInFrameLayout.setHorizontalGroup(
            jPanelInFrameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 511, Short.MAX_VALUE)
        );
```
machen... ehrlich gesagt WILL ich das gar nicht wissen...

Ob man diese Builder verwenden will... ist wohl Ansichtssache... ich habe sie nie verwendet, weil der Code, der rauskommt IMHO unlesbar (und, schon fast zwangsläufig, unwartbar) ist. Wenn man nur schnell irgendeinen Wegferf-Dialog zusammenklicken will, ist das vielleicht OK, aber als Grundlage für ein Spiel würde ich es nicht verwenden. (Und selbst wenn, kann es nicht schaden, das ganze vorher mal per Hand gemacht zu haben  )

Ein Vorschlag:

```
import java.awt.*;
import javax.swing.*;
import javax.swing.ImageIcon;
import javax.swing.JLabel;


public class NewJFrame extends javax.swing.JFrame {

    private JPanel boardPanel;

    public NewJFrame()
    {
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());

        boardPanel = new JPanel(new GridLayout(1,1));
        boardPanel.setBackground(Color.WHITE);

        Icon picture = new ImageIcon("image01.png");
        JLabel pictureLabel = new JLabel(picture);
        boardPanel.add(pictureLabel);

        getContentPane().add(boardPanel, BorderLayout.CENTER);
        pack();
    }


    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
}
```

Zumindest solange keine Details zum Layout und weiteren Aussehen bekannt sind...


----------



## daeve (21. Apr 2011)

Marco13 hat gesagt.:


> OK... hat es einen bestimmten Grund, warum du dieses GUI-Builder-Ding verwendest? Irgendwas scheint bei dem jPanelInFrameLayout schiefzugehen, und was genau so Zeilen wie
> 
> ```
> jPanelInFrameLayout.setHorizontalGroup(
> ...



Danke dir ! ich schaue mir das morgen mal an.

ich habe noch Buttons und einige Menupunkte... mit dem NetBeans spare ich so einiges an Zeit.(falls es funktioniert ???:L)


----------



## daeve (22. Apr 2011)

Hallo zusammen

also habe es gelöst mit Hilfe dieser Page: hintergrundbild netbeans frame - Mikrocontroller.net

ein Danke an alle für eure Bemühungen !


----------

