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]);
}
}
}
Jpanel com Botoes
3 Respostas
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.