Jpanel com Botoes

Ola Pessoal
Bom queria saber se tem como eu fazer o seguinte:
Tenho um Jpanel com uma image que seria um plano de fundo ai queria colocar botoes sob essa imagem só que quando faco isso a imagem desaparece.
Ouvi falar sobre um Jpanel em cima de outro mas nao sei como fazer isso alguem poderia me ajudar?
Ta ai o que tento fazer(ou o que consegui) :

[code]private Image w1;
private Image w2;
private Image w3;
long x;
private JButton[] buttons;
public Painel() throws MidiUnavailableException {
ImageIcon first=new ImageIcon(“C:\Users\daniel\Pictures\projeto\logo.jpg”);
w1=first.getImage();
ImageIcon second=new ImageIcon(“C:\Users\daniel\Pictures\projeto\first-wall-paper-custon.jpg”);
w2=second.getImage();
ImageIcon thirth=new ImageIcon(“C:\Users\daniel\Pictures\projeto\selecter-2.jpg”);
w3=thirth.getImage();
x=System.currentTimeMillis();
buttons=new JButton[2];
for(int a=0;a<2;a++){
buttons[a]=new JButton();
}
buttons[0].setIcon(new ImageIcon(“C:\Users\daniel\Pictures\projeto\new-game-button.jpg”));
buttons[1].setIcon(new ImageIcon(“C:\Users\daniel\Pictures\projeto\load-game-button.jpg”));
repaint();
}
public void paint(Graphics g){
super.paint(g);
long y=System.currentTimeMillis();
if(y-x<25200){
g.drawImage(w1, 0, 0, this);
Escreve();
}
if((y-x>=25200)&&(y-x<32000)){
g.drawImage(w2,0,0,this);
Escreve();
}
if(y-x>32000){
VisualizaBotao();
}

}
public void Escreve(){
	repaint();
}
public void VisualizaBotao(){
	long v=System.currentTimeMillis();
	if(v-x>32000){
		buttons[0].setLocation(100, 250);
		buttons[1].setLocation(300,250);
		add(buttons[0]);
		add(buttons[1]);
	}
}

}

[/code]

Quando sobrescrever componentes Swing, você deve sobrescrever o método paintComponent, não o paint.

O paint chama três métodos:
paintBorder: Para pintar a borda em torno do painel;
paintComponent: Que pinta o painel em si;
paintChilden: Que pinta tudo o que está sobre o painel.

É importante que a pintura do componente fique no meio, por isso, sobrescreva só o paintComponent.

Dê uma olhada nesse post, que também tem um painel que faz o que você quer:
http://www.guj.com.br/posts/list/56248.java#295271

E dê uma olhada nesse guia da Sun sobre componentes:
http://java.sun.com/products/jfc/tsc/articles/painting/#swing

Nao encontrei como resolver meu problema lá, talvez nao tinha ou nao fui capaz de ver isso :oops:
Aprendi como sobrescrever o paint() Mas foi só
O codigo do meu metodo é esse ai só queria colocar os botoes em cima da imagen…
Obs: w1 e w2 sao imagens que eu crio antes


long x=System.currentTimeMillis();
    public void paintChildren(Graphics g){
        super.paintChildren(g);
        long y=System.currentTimeMillis();
        if(y-x<25200){
        g.drawImage(w1, 0, 0, this);
        Escreve();
        }
        if((y-x>=25200)&&(y-x<32000)){
        	g.drawImage(w2,0,0,this);
        	Escreve();
        	}
        if(y-x>32000){
        	add(buttons[0]);
    		add(buttons[1]);
        }
        Escreve();
    }
    public void Escreve(){
    	repaint();
    }

Repetindo, você deve sobrescrever o paintComponent, não o paint e nem o paintChildren.

Outra coisa, nunca chame o método repaint() de dentro do método paintComponent ou paint. Portanto, remova aquelas chamadas ao método Escreve(). Chamar repaint força que o paint e o paintComponent sejam executados novamente e seu programa cairá num loop infinito. Sem falar que você pode acabar com uma interface pouco responsiva.

Funciona assim. O componente guarda propriedades que serão usadas durante sua pintura. Se uma dessas propriedades mudar (como o texto de um Label, por exemplo), o label terá que ser repintado. Então, você chama repaint() para avisar “ei, meu texto mudou preciso me desenhar de novo”. O método paint é acionado, para redesenhar o componente e refletir essa mudança.

Note que por isso, chamar o repaint() de dentro do paint() é horrível. Você se redesenhando e diz “mudei! Preciso me redesenhar de novo!”. E aí quando vai se redesenhar novamente, você diz que mudou novamente… até o infinito.