O botão só aparece quando o mouse fica sobre ele!

9 respostas
S

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?

import javax.swing.JApplet;
import javax.swing.*;
import java.awt.*;
public  class OiMundo extends JApplet{
JLabel Avisos;
JButton lampada1,lampada2;
Image imagem = null;
   Graphics g;
   pinta fundo;

public void init() {
 imagem = getImage(getCodeBase(),"LULA.png");
setLayout(new FlowLayout());

     lampada1 = new JButton();
     ImageIcon imagem = new ImageIcon("interruptor.png"); //caminho da imagem
 lampada1.setIcon(imagem); // configura a imagem ao botao.
lampada1.setPreferredSize(new Dimension(imagem.getIconWidth(),imagem.getIconHeight())); // para ficar do tamanho da imagem
add(lampada1);

     lampada2 = new JButton();
 lampada2.setIcon(imagem); // configura a imagem ao botao.
lampada2.setPreferredSize(new Dimension(imagem.getIconWidth(),imagem.getIconHeight())); // para ficar do tamanho da imagem
add(lampada2);
lampada2.setVisible(true);

}
public void update(Graphics g){
paint(g);
 }
public void paint(Graphics g) {



         if (imagem != null)
            g.drawImage(imagem, 0, 0, this);
            add(lampada1);
lampada1.setVisible(true);
 repaint();

 }

}

Valeu pela força pessoal!!! :smiley:

9 Respostas

G

No objeto lampada2 você chamou o método setVisible(true), no lampada1 você não chamou, talvez seja isso.

V

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

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

Obrigado pelas dicas, segui as orientações, o código está um pouco mais limpo agora:

import javax.swing.JApplet;
import javax.swing.*;
import java.awt.*;

public  class OiMundo extends JApplet{
//JLabel Avisos;
JButton lampada1,lampada2;

Image imagem = null;
   Graphics g;
//declara variaveis e objetos


public void init() {// método inicial
	imagem = getImage(getCodeBase(),"LULA.png"); // pega imagem LULA.png e guarda num objeto Image
setLayout(new FlowLayout());// Layout de fluxo, só para teste



     lampada1 = new JButton(); //declara o botão
     ImageIcon imagem = new ImageIcon("interruptor.png"); //caminho da imagem
	lampada1.setIcon(imagem); // configura a imagem ao botao.
lampada1.setPreferredSize(new Dimension(imagem.getIconWidth(),imagem.getIconHeight())); // para ficar do tamanho da imagem
add(lampada1);
lampada1.setVisible(true); //adiciona e seta visivel a lampada1

     lampada2 = new JButton();
	lampada2.setIcon(imagem); // configura a imagem ao botao.
lampada2.setPreferredSize(new Dimension(imagem.getIconWidth(),imagem.getIconHeight())); // para ficar do tamanho da imagem
add(lampada2);
lampada2.setVisible(true);



}


public void paint(Graphics g) {
         if (imagem != null){
            g.drawImage(imagem, 0, 0, this); // pinta imagem da lâmpada
            }
      }



}

mas o erro continua :frowning: … ninguém nunca teve esse problema?

V

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

certo, ficou assim:

import javax.swing.JApplet;
import javax.swing.*;
import java.awt.*;

public  class OiMundo extends JApplet{
//JLabel Avisos;
JButton lampada1,lampada2;

Image imagem = null;

//declara variaveis e objetos


public void init() {// método inicial
	imagem = getImage(getCodeBase(),"LULA.png"); // pega imagem LULA.png e guarda num objeto Image
setLayout(new FlowLayout());// Layout de fluxo, só para teste



     lampada1 = new JButton(); //declara o botão
     ImageIcon imagem = new ImageIcon("interruptor.png"); //caminho da imagem
	lampada1.setIcon(imagem); // configura a imagem ao botao.
lampada1.setPreferredSize(new Dimension(imagem.getIconWidth(),imagem.getIconHeight())); // para ficar do tamanho da imagem
add(lampada1);
lampada1.setVisible(true); //adiciona e seta visivel a lampada1

     lampada2 = new JButton();
	lampada2.setIcon(imagem); // configura a imagem ao botao.
lampada2.setPreferredSize(new Dimension(imagem.getIconWidth(),imagem.getIconHeight())); // para ficar do tamanho da imagem
add(lampada2);
lampada2.setVisible(true);



}


public void paint(Graphics g) {
	super.paint(g);
         if (imagem != null){
            g.drawImage(imagem, 0, 0, this); // pinta imagem da lâmpada
            }
      }



}

Infelizmente não funcionou ainda =(

S

Se alguem puder ajudar valeu mesmo!! :smiley:

V
Veja os comentários:
import javax.swing.*;
import java.awt.*;

public class OiMundo extends JApplet {
	//Melhor declarar as variáveis como private.
	private JButton lampada1;
	private JButton lampada2;
	private Image imagem = null;

	@Override	
	public void init() {
		
		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#thread
		EventQueue.invokeLater(new Runnable()
		{
			public void run() {
				initComponents();
			}
		});
	}

	//Ok, agora isso roda na thread do swing.
	protected void initComponents() {
		//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(new FlowLayout());

		lampada1 = new JButton(); 
		ImageIcon imagem = new ImageIcon("interruptor.png"); 
		lampada1.setIcon(imagem); 
		lampada1.setPreferredSize(new Dimension(imagem.getIconWidth(), imagem
				.getIconHeight())); 
		getContentPane().add(lampada1);		

		lampada2 = new JButton();
		lampada2.setIcon(imagem); 
		lampada2.setPreferredSize(new Dimension(imagem.getIconWidth(), imagem
				.getIconHeight())); 
		getContentPane().add(lampada2);		
	}

	@Override
	public void paint(Graphics g) {		
		//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/#swing
		Graphics2D g2d = (Graphics2D)g.create(); //Faça uma cópia dele
		if (imagem != null) {
			g2d.drawImage(imagem, 0, 0, this); 
		}
		g2d.dispose(); //Libere a cópia no final

		super.paintComponents(g);
	}
}
S

muito obrigado pela aula particular :smiley: é… 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

Criado 27 de julho de 2008
Ultima resposta 28 de jul. de 2008
Respostas 9
Participantes 3