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”.
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.
