Olá Gujeros, blza?! To fazendo um sistema web que controla componentes eletrônicos, e tá com um Bugzinho na JApplet: A imagem do interruptor que está num botão só aparece quando o mouse fica sobre ele. Alguem sabe como faz pra imagem aparecer certinho, com todos os componentes sem ter que por o mouse encima?
importjavax.swing.JApplet;importjavax.swing.*;importjava.awt.*;publicclassOiMundoextendsJApplet{JLabelAvisos;JButtonlampada1,lampada2;Imageimagem=null;Graphicsg;pintafundo;publicvoidinit(){imagem=getImage(getCodeBase(),"LULA.png");setLayout(newFlowLayout());lampada1=newJButton();ImageIconimagem=newImageIcon("interruptor.png");//caminho da imagemlampada1.setIcon(imagem);// configura a imagem ao botao.lampada1.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));// para ficar do tamanho da imagemadd(lampada1);lampada2=newJButton();lampada2.setIcon(imagem);// configura a imagem ao botao.lampada2.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));// para ficar do tamanho da imagemadd(lampada2);lampada2.setVisible(true);}publicvoidupdate(Graphicsg){paint(g);}publicvoidpaint(Graphicsg){if(imagem!=null)g.drawImage(imagem,0,0,this);add(lampada1);lampada1.setVisible(true);repaint();}}
No objeto lampada2 você chamou o método setVisible(true), no lampada1 você não chamou, talvez seja isso.
V
ViniGodoy
Rapaz… esse seu código está uma bagunça.
Pq vc dá add em lampada1 no método paint? Você percebeu que o add está fora do if?
Via de regra, não mude a propriedades dos componentes durante o paint.
Isso pode fazer com que o paint seja chamado novamente, infinitas vezes.
Por que sua identação está essa zona?
Comece organizando a casa… pode ser que só aí vc já resolva seu problema.
Você também não precisa escrever o método update, se for para fazer só isso. Isso é o que o Swing já faz, como você pode ver na documentação.
S
shamanpyro
Obrigado pelas dicas, mas fiz essa zona na tentativa de arrumar o bug, foi por tentativa e erro… puis n veses, tentei de todas as formas, mas pelo jeito piorou né ^^
S
shamanpyro
Obrigado pelas dicas, segui as orientações, o código está um pouco mais limpo agora:
importjavax.swing.JApplet;importjavax.swing.*;importjava.awt.*;publicclassOiMundoextendsJApplet{//JLabel Avisos;JButtonlampada1,lampada2;Imageimagem=null;Graphicsg;//declara variaveis e objetospublicvoidinit(){// método inicialimagem=getImage(getCodeBase(),"LULA.png");// pega imagem LULA.png e guarda num objeto ImagesetLayout(newFlowLayout());// Layout de fluxo, só para testelampada1=newJButton();//declara o botãoImageIconimagem=newImageIcon("interruptor.png");//caminho da imagemlampada1.setIcon(imagem);// configura a imagem ao botao.lampada1.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));// para ficar do tamanho da imagemadd(lampada1);lampada1.setVisible(true);//adiciona e seta visivel a lampada1lampada2=newJButton();lampada2.setIcon(imagem);// configura a imagem ao botao.lampada2.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));// para ficar do tamanho da imagemadd(lampada2);lampada2.setVisible(true);}publicvoidpaint(Graphicsg){if(imagem!=null){g.drawImage(imagem,0,0,this);// pinta imagem da lâmpada}}}
mas o erro continua … ninguém nunca teve esse problema?
V
ViniGodoy
Tente colocar na primeira linha do seu paint:
super.paint(g);
Isso fará com que o método de pintura normal do JApplet seja chamado.
Outra coisa, aparentemente aquela variável g que vc criou na linha 10 não está servindo para nada. Apague-a.
Não é aconselhavel guardar o objeto Graphics, já que ele pode mudar a cada vez que o paint é chamado (isso pq o swing usa double buffering).
S
shamanpyro
certo, ficou assim:
importjavax.swing.JApplet;importjavax.swing.*;importjava.awt.*;publicclassOiMundoextendsJApplet{//JLabel Avisos;JButtonlampada1,lampada2;Imageimagem=null;//declara variaveis e objetospublicvoidinit(){// método inicialimagem=getImage(getCodeBase(),"LULA.png");// pega imagem LULA.png e guarda num objeto ImagesetLayout(newFlowLayout());// Layout de fluxo, só para testelampada1=newJButton();//declara o botãoImageIconimagem=newImageIcon("interruptor.png");//caminho da imagemlampada1.setIcon(imagem);// configura a imagem ao botao.lampada1.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));// para ficar do tamanho da imagemadd(lampada1);lampada1.setVisible(true);//adiciona e seta visivel a lampada1lampada2=newJButton();lampada2.setIcon(imagem);// configura a imagem ao botao.lampada2.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));// para ficar do tamanho da imagemadd(lampada2);lampada2.setVisible(true);}publicvoidpaint(Graphicsg){super.paint(g);if(imagem!=null){g.drawImage(imagem,0,0,this);// pinta imagem da lâmpada}}}
Infelizmente não funcionou ainda =(
S
shamanpyro
Se alguem puder ajudar valeu mesmo!!
V
ViniGodoy
Veja os comentários:
importjavax.swing.*;importjava.awt.*;publicclassOiMundoextendsJApplet{//Melhor declarar as variáveis como private.privateJButtonlampada1;privateJButtonlampada2;privateImageimagem=null;@Overridepublicvoidinit(){imagem=getImage(getCodeBase(),"LULA.png");//O init roda numa thread separada e é necessário criar os objetos//na thread do swing. Para fazer isso, usamos o eventQueue.invokeLater.//Mais informações: //http://java.sun.com/docs/books/tutorial/uiswing/components/applet.html#threadEventQueue.invokeLater(newRunnable(){publicvoidrun(){initComponents();}});}//Ok, agora isso roda na thread do swing.protectedvoidinitComponents(){//No caso do JApplet, você deve usar o getContentPane() no lugar de adicionar //diretamente. Não sei se isso mudou no Java 5 como os demais componentes do //swing. Então, por via das dúvidas, vamos fazer desse jeito.getContentPane().setLayout(newFlowLayout());lampada1=newJButton();ImageIconimagem=newImageIcon("interruptor.png");lampada1.setIcon(imagem);lampada1.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));getContentPane().add(lampada1);lampada2=newJButton();lampada2.setIcon(imagem);lampada2.setPreferredSize(newDimension(imagem.getIconWidth(),imagem.getIconHeight()));getContentPane().add(lampada2);}@Overridepublicvoidpaint(Graphicsg){//O que você quer com esse código? //Na primeira vez, ele irá sobrescrever o component com sua imagem.//Quando vc posicionar o mouse sobre o componente, ele irá ser //repintado, mas o fundo não. Pode ser que isso esteja causando o //efeito ruim que vc está vendo. Pense em usar um JImagePanel no lugar.//http://www.guj.com.br/posts/list/56248.java#295271//Anyway, vc não deve usar o g recebido como parâmetro diretamente//Mais informações://http://java.sun.com/docs/books/tutorial/uiswing/painting///http://java.sun.com/products/jfc/tsc/articles/painting/#swingGraphics2Dg2d=(Graphics2D)g.create();//Faça uma cópia deleif(imagem!=null){g2d.drawImage(imagem,0,0,this);}g2d.dispose();//Libere a cópia no finalsuper.paintComponents(g);}}
S
shamanpyro
muito obrigado pela aula particular é… axo que é comigo mesmo… no seu código fica tudo cinza no fundo… vou dar uma olhada nos posts dos coments pra ver se ajuda