Bom pessoal, estou utilizando vários JInternalFrames com um panel dentro onde eu desenho direto neste panel, utilizando o paintComponent(). O problema é quando eu arrasto um JInternalFrame para cima de um outro o panel do de baixo não é “repintado”. Além disso, quando seleciono um panel e faço desenho neste, o outro simplesmente apaga. Será que alguém tem ideia de como fazer para desenhar sem ter esses “bugs”.
JInternalFrames e paintComponent()
7 Respostas
Onde você está armazendando os desenho que você está fazendo? Se você não armazenar em algun lugar, os desenhos vão se perder mesmo. POste o código dos seus JInternafram ai pra gente.
Pode pelo menos postar um screenshot do problema? Use a opção de attachments do GUJ, logo abaixo do local onde você escreve o texto da sua mensagem.
Aqui vai o código do paintComponent():
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
fundo.desenharFundo(g);
if(comando != null)
{
System.out.println("Desenhando ferramenta");
comando.desenhar(g);
}
if(tx!=null)
g2d.setTransform(tx);
desenharFormas(g);
g2d.dispose();
}
A ss do problema ta anexada. Como vocês podem ver a parte onde uma tela sobrepõe a outra não é renderizada corretamente.
Precisamos também do código do desenharFormas(g). aliás, porque você usa g ao invés de usar g2d? Você já o criou, num precisa, mais usar o g. Use só g2d mesmo no lugar onde está usando g hoje.
Tomada a dica do amigo elissonandrade.
Código do desenharFormas modificado:
private void desenharFormas(Graphics2D g2d)
{
System.out.println("Formas : "+formas.size());
// Graphics2D g2d =(Graphics2D) g.create();
// g2d.setTransform(fundo.getAffineTransform());
for(FormaGeometrica forma : formas)
{
forma.desenhar(g2d);
}
g2d.dispose();
}
Pessoal, descobri onde está o problema, agora preciso saber como resolve-lo. Ele está aqui:
public void desenharFundo(Graphics2D g)
{
Graphics2D g2d = (Graphics2D) g.create();
int width = g2d.getClipBounds().width; //Aqui, quando eu movo uma janela em cima da outra, esse valor muda, parece que ele representa a largura visível do componente, mas como eu mando pintar na cordenada 0,0 ele não pinta a diferença.
int height = g2d.getClipBounds().height; //Vale o mesmo para a alutra.
System.out.println("width: "+width+" height: "+height);
g2d.setBackground(corFundo);
g2d.clearRect(0, 0, width, height);
if(grid)
{
g2d.setColor(corGrid);
int qntLinhasX = (int) (width / tamanhoGrid+1);
int qntLinhasY = (int) (height / tamanhoGrid+1);
int qntRetroX = (int) (this.affineTransform.getTranslateX()/this.tamanhoGrid);
double inicX = (this.affineTransform.getTranslateX() - (qntRetroX*tamanhoGrid));
for(int i = 0; i < qntLinhasX; i++)
{
g2d.drawLine((int) inicX, 0,(int) inicX, height);
inicX += this.tamanhoGrid;
}
int qntRetroY = (int) (this.affineTransform.getTranslateY()/this.tamanhoGrid);
double inicY = (this.affineTransform.getTranslateY() - (qntRetroY*this.tamanhoGrid));
for(int i = 0; i < qntLinhasY; i++)
{
g2d.drawLine(0,(int) inicY, width,(int) inicY);
inicY += this.tamanhoGrid;
}
g2d.setColor(corEixo);
g2d.drawLine(0, (int) this.affineTransform.getTranslateY(), width, (int) this.affineTransform.getTranslateY() );
g2d.drawLine((int) this.affineTransform.getTranslateX(), 0,(int) this.affineTransform.getTranslateX(), height);
}
g2d.dispose();
}
Vocês tem ideia de como eu posso alterar isso para que ele pinte meu fundo de branco?
Bom galera resolvi da seguinte maneira:
public void desenharFundo(Graphics2D g, JPanel parent)
{
Graphics2D g2d = (Graphics2D) g.create();
int width = parent.getWidth();
int height = parent.getHeight();
System.out.println("width: "+width+" height: "+height);
g2d.setBackground(corFundo);
g2d.clearRect(0, 0, width, height);
//....
}
Como o Graphics2D.getClipbounds me retornava apenas a área visível, agora eu passo o panel para pegar o tamanho total do componente, e pinto ele por completo, removendo todas as falhas. Se vocês tiverem algum solução mais “elegante” por favor me digam, mas foi essa a forma que eu encontrei. Agora só estou enfrentando problemas com o Zoom, mas acho que isso é tema para um outro tópico. Vlw pela força ae galera, e pela dica alissonandrade, isso tiro uns “fantasmas” que tinha no desenho.
