# Buttons und Label nicht im Vordergrund



## Gast (8. Mrz 2005)

Habe folgende Klassen:


```
public class BackgroundPanel extends JPanel {
	
	private MenuPanel p_menu = new MenuPanel();
	private GamePanel p_game = new GamePanel();
	private HighscorePanel p_highscores = new HighscorePanel();
	private JLabel l_bgImage = new JLabel(new ImageIcon("background.jpg"));
	
	public BackgroundPanel(){
		initPanel();
		initL_bgImage();
		addComponents();
	}
	
	public void initPanel(){
		setBounds(0, 0, Game.WIDTH, Game.HEIGHT + 100);
		setVisible(true);		
	}
	
	public void initL_bgImage(){
		l_bgImage.setBounds(0, 0, Game.WIDTH, Game.HEIGHT + 100);
	}
	
	public void addComponents(){
		add(l_bgImage);
		add(p_menu);
		add(p_game);
		add(p_highscores);
	}
	
	public JLabel getL_bgImage(){
		return l_bgImage;
	}
	
	public MenuPanel getP_menu(){
		return p_menu;
	}
	
	public GamePanel getP_game(){
		return p_game;
	}
	
	public HighscorePanel getP_highscores(){
		return p_highscores;
	}
	
}
```


```
public class MenuPanel extends JPanel {
	
	private String directory = "D:\\My Documents\\Programs\\Games & Fun\\Saloon Gunners\\gui\\";
	private JLabel l_header = new JLabel(new ImageIcon("saloon_gunners.gif"));
    private JButton b_startGame = new JButton("Start Game");
    private JButton b_viewHighscores = new JButton("View Highscores");
	private JButton b_exit = new JButton("Exit");
	
    public MenuPanel(){
    	initPanel();
    	initComponents();
    	addComponents();
    }
    
    public void initPanel(){
    	setBounds(0, 0, Game.WIDTH, Game.HEIGHT);
    	setLayout(null);
    	setOpaque(false);
    }
    
    public void initComponents(){   	
    	l_header.setBounds(200, 30, 400, 150);
    	b_startGame.setBounds(300, 160, 200, 100);
    	b_viewHighscores.setBounds(300, 265, 200, 100);
    	b_exit.setBounds(300, 370, 200, 100);  	
    }
    
    public void addComponents(){
    	add(l_header);
    	add(b_startGame);
    	add(b_viewHighscores);
    	add(b_exit);
    }
    
}
```

Und hier der MainFrame für die Panels:


```
public class MainFrame extends JFrame {
    
    private Controller sysController = new Controller();
    private BackgroundPanel p_background = new BackgroundPanel();
    
    public MainFrame(Controller sysController) {
        this.sysController = sysController;
        initFrame();
        getContentPane().add(p_background);
    }

    private void initFrame(){    	
        setVisible(false);
        setTitle("Saloon Gunners");
        setLayout(null);
        setSize(Game.WIDTH, Game.HEIGHT + 100);
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);       
        setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        setVisible(true);   
    }
    
}
```

P.S.: sysController, GamePanel und HighscorePanel habe ich mal weggelassen, die Spielen heir nicht so die Rolle. Das Problem ist nämlich, dass beim Anzeigen des MainFrame die Buttons und das Label vom MenuPanel nicht angezeigt werden. Die Buttons werden erst sichtbar, wenn man die Maus drüberbewegt, das Label überhaupt nicht.
Nach Minimieren und Maximieren muss man das gleiche Spiel wiederholen.

Das MenuPanel mit seinen Komponenten sollte aber von alleine Sichtbar sein.

Was fehlt?


----------



## Wildcard (8. Mrz 2005)

Verwendest du irgendwo AWT? Hast du irgendwelche paint Methoden überschrieben?


----------



## Gast (8. Mrz 2005)

Nein, alle verwendeten Objekte sind Swing-Objekte.


----------



## Wildcard (8. Mrz 2005)

Swing und AWT lässt sich nicht wirklich mischen.
Wo und warum verwendest du AWT?


----------



## Gast (8. Mrz 2005)

Gibt es denn keine Möglichkeit vielleicht in meinem BackgroundPanel die Reihenfolge (Vordergrund, Hintergrund) meiner Kinder-Panels und vor allem des l_bgImage festzulegen?


----------



## Gast (8. Mrz 2005)

Wildcard hat gesagt.:
			
		

> Swing und AWT lässt sich nicht wirklich mischen.
> Wo und warum verwendest du AWT?



Ich verwende doch kein AWT.
JPanels sind doch Swing-Klassen, genauso wie die JButtons und JLabels, die ich verwende.


----------



## Wildcard (8. Mrz 2005)

> Gibt es denn keine Möglichkeit vielleicht in meinem BackgroundPanel die Reihenfolge (Vordergrund, Hintergrund) meiner Kinder-Panels und vor allem des l_bgImage festzulegen?


Einfache Regel:
was zuletzt gezeichnet wird liegt ganz oben.
Wieso wird dein Menu überhaupt verdeckt? Welche Komponente liegt da drüber?


----------



## Gast (8. Mrz 2005)

Wildcard hat gesagt.:
			
		

> Einfache Regel:
> was zuletzt gezeichnet wird liegt ganz oben.
> Wieso wird dein Menu überhaupt verdeckt? Welche Komponente liegt da drüber?



Ach so, der letzte kommt zuerst. Warte, ich überprüfe das mal.


----------



## Gast (8. Mrz 2005)

Also, ich hab das mal geändert. Beim BackgroundPanel wird das Menu Panel jetzt erst zum Schluss geadded. Trotzdem ist es immer noch das selbe Problem.



			
				Wildcard hat gesagt.:
			
		

> Wieso wird dein Menu überhaupt verdeckt? Welche Komponente liegt da drüber?



Ob's wirklich verdeckt ist, weiß ich nicht genau, sieht jedenfalls so aus. Wie gesagt, ich muss erst immer die Maus drüberbewegen, damit die Buttons auf dem MenuPanel sichtbar werden.


----------



## Wildcard (8. Mrz 2005)

Wenn du dir sicher bist kein AWT zu nutzen, dann nochmal die andere Frage:
Überschreibst du irgendwelche paint, paintComponent,... Methoden?


----------



## Gast (8. Mrz 2005)

Nein, aber hier noch die Klasse GamePanel. Wie du siehst, lade ich nur ein paar Images in ein Array und wende den MediaTracker auf sie an. Sollte doch eigentlich nicht schaden, oder?


```
public class GamePanel extends JPanel {
	
	private Image[] targetImages = new Image[Game.MAX_TARGETS];
	
	public GamePanel(){
		initPanel();
		initTargetImages();
	}
	
	public void initPanel(){
		setBounds(0, 0, Game.WIDTH, Game.HEIGHT);
		setLayout(null);
		setOpaque(false);
	}
	
	public void initTargetImages(){
		
		targetImages[0] = getToolkit().getImage("target1.gif");
		targetImages[1] = getToolkit().getImage("target2.gif");
		targetImages[2] = getToolkit().getImage("target3.gif");
		targetImages[3] = getToolkit().getImage("target4.gif");
		targetImages[4] = getToolkit().getImage("target5.gif");
		
		MediaTracker mediaTracker = new MediaTracker(this);
		for(int i = 0; i < targetImages.length; i++){
			mediaTracker.addImage(targetImages[i], i);
		}
		try{
			mediaTracker.waitForAll();
		} catch (InterruptedException e){
			
		}
		
	}

}
```


----------



## Wildcard (8. Mrz 2005)

Kann mir noch nicht so richtig vorstellen wie das Problem aussieht. Kannst du mir eine PN mit deinen Klassen schicken das ich mir das selbst mal ansehe?


----------



## Gast (8. Mrz 2005)

Klar, aber was ist eine PN?


----------



## Wildcard (8. Mrz 2005)

Müsstest du dich anmelden. Auf meinen Nick klicken und PN anklicken


----------



## Gast (8. Mrz 2005)

Achso, moment, ich muss mich noch registrieren.


----------



## Nerowinger (8. Mrz 2005)

So, hab's jetzt zugeschickt.

Gruß Nerowinger


----------



## Nerowinger (9. Mrz 2005)

Schon was gefunden?


----------



## Nerowinger (9. Mrz 2005)

Kann es sein, dass man dieses Problem nicht hätte, wenn man ausschließlich AWT-Klassen verwenden würde?


----------



## Nerowinger (9. Mrz 2005)

Super!!!        

Ich hab's jetzt.

Das Beispiel hat mir sehr geholfen. Alles funktioniert jetzt genauso wie geplant!

Vielen, vielen Dank, du hast mir echt viele Stunden erspart.



Gruß Nerowinger


----------



## Wildcard (9. Mrz 2005)

*geehrt sein*  8) 
Damit alle was davon haben:

```
public class Main extends JFrame
{
    public Main()
    {
        setSize(1024,768);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        JLayeredPane pane = new JLayeredPane();
        pane.setBounds(0,0,1024,768);
        pane.add(createBackground(),JLayeredPane.DEFAULT_LAYER);
        pane.add(new MenuPanel(),JLayeredPane.MODAL_LAYER);
        add(pane);
        setVisible(true);
    }

    /**
     * @return label
     */
    private JLabel createBackground()
    {
        JLabel label = new JLabel(new ImageIcon("hier dein Hintergrundbild einsetzen"));
        label.setBounds(0,0,getWidth(),getHeight());
        return label;
    }

    public static void main(String[] args)
    {
        Main m = new Main();
    }
}


public class MenuPanel extends JPanel
{
    public MenuPanel()
    {
        setLayout(null);
        setBounds(200,200,100,100);
        JButton button = new JButton("TestButton");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                // TODO Auto-generated method stub

            }
        });
        button.setBounds(0,0,100,100);
        add(button);
    }
  
}
```


----------



## Nerowinger (9. Mrz 2005)

PS: Ich konnte die Klassen sogar so lassen, wie sie waren. Musste nur dafür sorgen, dass BackgroundPanel einen JLayeredPane extendet. Dann beim adden der Panels das l_bgImage einfach als DEFAULT_LAYER, das MenuPanel und die anderen Panels als MODAL_LAYER adden. Ach ja, und die Visibility des MainFrame erst ganz zum Schluss setzen.

Das neue war wirklich das mit dem JLayeredPane, was ich mir zum Verständnis noch mal in der Java-Doku anschauen werde.

Danke noch mal.

Gruß Nerowinger


----------

