# JLabel wird nicht angezeigt (bin verzweifelt!)



## Babba_BLuBB (8. Mrz 2005)

Hallo Leute!

Ich will eine Art gerisches Menü bauen. Im Grund eigendlich nur ein JPanel mit einem Hintergrundbild und JLabels drauf.
Leider werden die JLabels nicht angezeigt. Wenn ich allerdings aus dem JLabel ein normales Label (AWT) mache, wird es wunderbar über die Grafik "gemalt". Die Schrift sieht zwar sehr verzogen aus, aber immerhin wird es angezeigt. 

Hier mal der Quellcode meiner Klasse MenuFrame


```
import javax.swing.*;
import java.awt.*;
import java.util.*;

public class MenuFrame extends JPanel {

    // 0.0 Variablendeklaration
    private Image backgroundImage;		// Nimmt das Hintergrundbild auf
    
    // 0.1 Konstanten deklarieren
    private final Font STDFONT = new Font("Luxi Sans", Font.PLAIN, 10);
    private final Color STDBACKCOL = new Color(215, 222, 248);
    private final Color STDHEADLINESPCOL = new Color(236, 240, 252);
    private final Color STDHEADLINECOL = new Color(34, 90, 201);
    private final Color STDCOL = Color.BLACK;
    
    
    // 1.1 Konstruktor
    public MenuFrame() {
        
        // Konstruktor der Superklasse
        super();
        
        // Layoutmanager setzen
        setLayout(null);
        
        // Bild laden und auf Laden warten
        backgroundImage = getToolkit().createImage("pics/background.jpg");
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(backgroundImage, 0);
        try { mt.waitForAll(); }
        catch (InterruptedException e) {}
        
        // Hauptmenu darstellen
        makeMainMenu(100);        
        
    }
    
    // 1.2 Hilfsmethoden fuer den Konstruktor
    
    // 1.2.1 Methode, die das Hauptmenu erstellt
    private void makeMainMenu(int top) {
        
        // Lokale Variablen deklarieren
        JLabel label;
        
        // Label fuer Programmstatus
        label = new JLabel("Programmstatus");
        label.setFont(STDFONT);
        label.setForeground(STDCOL);
        label.setBackground(STDBACKCOL);
        label.setSize(200, 15);
        label.setLocation(30, top);
        add(label);
        
    }
    
    
    public void paint(Graphics g) {
        
        // Bild zeichnen
        g.drawImage(backgroundImage, 0, 0, this);
        
    }
    
}
```

Habe keine Ahnung wo der Fehler liegen könnte. Ich beschäftige mich erst seit kurzem mit Swing und AWT und schätze dass ich einfach irgendwas sau blödes übersehen hab.

Grüße und schon mal vorab Danke für eure Hilfe!!


----------



## niemand (8. Mrz 2005)

```
public void paint(Graphics g) {
        super.paint(g);
        // Bild zeichnen
        g.drawImage(backgroundImage, 0, 0, this);
       
    }
```
Versuch mal, hat bei mir bei einem ähnlichen Problem geholfen. Ich sollte mich wirklich mal mehr mit Swing beschäftigen ...

cu


----------



## Babba_BLuBB (8. Mrz 2005)

Danke für den Tip. Hab ich gerade versucht, bringt aber nichts.
Das Hintergrundbild wird angezeigt, aber kein Label.

Ich find das nur so komisch, dass ein Label angezeigt wird, ein JLabel aber nicht....  :bahnhof:


----------



## Babba_BLuBB (8. Mrz 2005)

Ich hab gerade ne Lösung gefunden!!!   
Aber der Swing-Krempel macht mich noch ganz bekloppt!!!

Ich leite meine Klasse MenuFrame nicht von JPanel ab sondern von JLayeredPane.
Die Methode paint muss so aussehen:


```
public void paint(Graphics g) {
        
        // Bild zeichnen
        g.drawImage(backgroundImage, 0, 0, this);
       
        // Steuerelemente ueber das Bild zeichnen
        super.paint(g);

}
```

Wenn ich super.paint(g) weiter oben aufrufe, dann ueberlagert das Hintergrundblid die Steuerelemente. Andersherum nicht....


----------



## thE_29 (8. Mrz 2005)

Dir ist schon klar, das ein normales AWT Label heavyweight ist und dir deswegen dein Bild übermalt und du in deiner paint Methode deine ganzen JLabels mit dem Bild übermalst!



Nachtrag: hast du überhaupt bisi Ahnung zwischen Swing und AWT und was super.paint(g) macht, bzw für was die paint Methode da ist??


Wenn du dir alles selber drübermalst, brauchst dich net wundern das es net geht....


----------



## Babba_BLuBB (8. Mrz 2005)

thE_29 hat gesagt.:
			
		

> Dir ist schon klar, das ein normales AWT Label heavyweight ist und dir deswegen dein Bild übermalt und du in deiner paint Methode deine ganzen JLabels mit dem Bild übermalst!
> 
> 
> 
> ...



Hab doch im 1. Posting schon erwähnt, dass ich mich erst seit kurzem mit GUI in Java beschäftige.
So weit ich weis, ist die paint-Methode dafür da grafische "Sachen" (also Striche, Rechtecke...) auf dem JFrame auszugeben. Also ist da ja auch die richtige Position um ein Hintergrundbild einzufuegen, oder?

Dass sich dieses Hintergrundbild dann über alles drüberlegt steht in keinem Buch (zu mindest nicht in denen, die ich gelesen hab...)

Mit super.paint(g) rufe ich die Methode paint der Klasse JFrame auf, die dann alles das neu malt, dass ich in den jFrame reisgepackt habe, richtig?


----------



## Roar (8. Mrz 2005)

zum 100ten mal jetzt: in swing *nicht* paint überschreiben, sondern paintComponent(). wenn man dann noch brav super.paintComponent() aufruft wird alles schön dargestellt.


----------



## Babba_BLuBB (8. Mrz 2005)

Roar hat gesagt.:
			
		

> zum 100ten mal jetzt: in swing *nicht* paint überschreiben, sondern paintComponent(). wenn man dann noch brav super.paintComponent() aufruft wird alles schön dargestellt.



Na das ist doch mal ne Aussage! Genau das was ein Swing-NooB braucht!!!
Danke!!!  :toll:


----------

