JInternalFrames e paintComponent()

7 respostas
N

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

7 Respostas

E

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.

ViniGodoy

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.

N

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.


E

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.

N

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();
    }
N

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?

N

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.

Criado 7 de setembro de 2012
Ultima resposta 8 de set. de 2012
Respostas 7
Participantes 3