Problema com paintComponent?

4 respostas
A

Ae pessoal, estou com um probleminha bizarro aqui, e ainda nao consegui achar a solução… se alguem já passou por isso e sabe como resolver, da uma ajudinha ae, obrigado…

tenho o codigo abaixo

public class SButton extends JButton {
	Image img = null;
	
	public SButton(String text, String imgName) {
		super(text);
		this.setBackground(new Color(0,0,0,0));
                img = Sys.getResourceImage(imgName);
	}
	
	@Override
	protected void paintComponent(Graphics g) {	
                myPaint(g); super.paintComponent(g); 
        }
	
	private void myPaint(Graphics g) {
		g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), null);
	}
}

o intuito desta classe é desenhar uma imagem atras do texto do JButton, pois a cor de fundo foi setada para transparente (0,0,0,0).

até que funciona, só que algumas vezes exporádicas ele nao desenha o fundo, ou desenha outra parte do formulario no fundo do JButton, coisa estranha…
eu analisei o código e vi que o gui chama o paintImmediately e as x chama o update…
nao entendi mto bem o porque nas subclasses da arquitetura java parece não chamar sempre o paintComponent. Eu sei que ele usa o paintImmediately para pintar regiões rapidamente do componente, mas se isso acontece, como eu faria para usar então corretamente o paintComponent… ???

4 Respostas

T

Tive um problema meio chato com isso, e acabei meio que “decorando” o fonte do JButton, de tanto lê-lo para tentar entendê-lo.

No fim das contas achei melhor pedir pro pessoal que criava as imagens a serem postas no fundo dos botões que também desenhasse o texto (aí seu JButton só teria o “Icon”, não o “Text”. ) Ficou meio chato porque não ficou nada flexível. Acredito que você teria uma situação melhor se pudesse achar algo que fosse derivado do JButton mas pronto e com esse problema resolvido.

Outra maneira de resolver isso é usar o Synth e criar seu próprio “look & feel”, se estiver usando Java 5.0 ou superior.
Dá um pouco de trabalho para entender como é que se usa o Synth, além de não haver muita literatura para ele, mas funciona mais ou menos.

A

valeu thingol, tbm ja estava começando a decorar a api, mas parece que deu certo uma coisa que mudei aqui…
no codigo

....
 img = Sys.getResourceImage(imgName);
...

quando ele chama esse metodo, ocorre:

public static Image getResourceImage(String file) {
  return Toolkit.getDefaultToolkit().createImage(path_img_rs + file);
}

e não sei porque as x, a imagem é criada após algum tempo depois desta instrução, embora ela retorne a instancia da classe, deve ser ter algo haver com a thread que cuida disso, ela cria a imagem mas não da tempo de terminar e o formulário pinta antes… eu achava que o …createImage esperava pelo retorno… mas sei la… estranho…
para contornar isso eu tive que carregar as imagens em um vetor estatico pra poder usar em todo sistema, sem esses problemas loucos…

T

Para esperar o carregamento da imagem, use MediaTracker. (Essa coisa maluca de criar a imagem mas ela não ser carregada imediatamente foi criada, na verdade, para dar suporte a GIFs animados e imagens carregadas da Internet, onde a imagem pode demorar um pouco para ser baixada).

A

eu tinha conhecimento sobre o MediaTracker, já até usei uma vez numa aplicação, só não achava que com o carregamento local ia acontecer isso eheheh, é improvável porém possível, como foi visto…
essa é um bom exemplo de relação de hardware com a funcionalidade da aplicação, ou seja, o msm exemplo poderia rodar legal em uma máquina rápida, e/ou poderia rodar ruim em uma máquina lenta, como a minha, ehheheh
:slight_smile:

Criado 18 de junho de 2007
Ultima resposta 19 de jun. de 2007
Respostas 4
Participantes 2