Jpanel com Botoes

3 respostas
kaial
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) :
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]);
    	}
    }
}

3 Respostas

ViniGodoy

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

kaial

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();
    }
ViniGodoy

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.

Criado 23 de maio de 2010
Ultima resposta 25 de mai. de 2010
Respostas 3
Participantes 2