Pq desenho do graphics no paintComponent some com minimize?

4 respostas
C

Sobrescrevi o método paintComponent de um JPanel para desenhar uma forma com o graphics.

Problema: ao minimizar e voltar a imagem desaparece até que eu de um repait via botão por exemplo.

Como fazer para a imagem continuar? O mesmo acontece sobrescrevendo paint.

Não existe uma maneira mais bonita do que via evento na janela?

abc
Cadu

4 Respostas

dudaskank

Hmm, estranho, fiz um teste aqui e ficou o meu desenho no JFrame... olha como fiz:

package teste;

import java.awt.Graphics;

import javax.swing.JFrame;

public class MinimizaEFicaDesenhado extends JFrame {

	private static final long serialVersionUID = 1L;

	public void paint(Graphics g) {
		super.paintComponents(g);
		g.drawLine(0, 0, getWidth(), getHeight());
	}

	public MinimizaEFicaDesenhado() {
		super();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(320, 240);
	}

	public static void main(String[] args) {
		MinimizaEFicaDesenhado x = new MinimizaEFicaDesenhado();
		x.setVisible(true);
	}

}

Mais uma coisa estranha... tentei colocar o código em um paintComponents() como você falou, mas não desenhou minha linha... nem na primeira vez.

C

É... assim funciona mesmo... mas o meu é dinamico e ai não vai quando minimiza... não sei se é por causa da transformada :/

o código:

protected void paintComponent(Graphics g) {	  
	
    Graphics2D g2d = (Graphics2D)g;    
    Dimension size = getSize();
    g2d.setColor(backgroundColor);
    g2d.fillRect(0, 0, getWidth(), getHeight());
    
    //ESSE CIRCLE NUNCA SOME
    g2d.setColor(Color.BLACK);
    Ellipse2D.Double circle2 =
	    new Ellipse2D.Double(10, 10, 350, 350);
    g2d.fill(circle2);
    
    
    Shape shape = polygonCollection.getShapeFromPolygons();
    Rectangle2D ret = shape.getBounds2D();    
    
    float lm = (float)ret.getWidth();
    float am = (float)ret.getHeight();
    float lc = (float)size.getWidth() - 20;
    float ac = (float)size.getHeight() - 20;
    float xcm = (float)ret.getCenterX();
    float ycm = (float)ret.getCenterY();
    float s = Math.min(lc / lm, ac / am);
    float sx = s;
    float sy = -s;
    float tx = lc / 2F - sx * xcm + 10;
    float ty = ac / 2F - sy * ycm + 10;
    //TRANSFORMADA
    g2d.setRenderingHint(
      RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    AffineTransform transform = new AffineTransform();
    transform.setTransform(sx, 0, 0, sy, tx, ty);
    g2d.setTransform(transform);
    g2d.setStroke(new BasicStroke(1.5f / s));
    
    ShapeColor[] shapes = polygonCollection.getShapes();
    for (int i = 0; i < shapes.length; i++) {  
      g2d.setColor(fillColor);
      g2d.fill(shapes[i].getShape());
      g2d.setColor(shapes[i].getColor());
      g2d.draw(shapes[i].getShape());
    }
  }
}

o circle antes da transformada mantem...nao tendi..ta brabo

davidbuzatto

Kra, tenta desfazer a transformação antes de finalizar o método.
A transformação ta sendo mantida, e quando o método paintComponent é chamado denovo é feita uma nova tranformação em cima da anterior. Sempre quando vc usar transformações, mudanças de coordenadas, rotações, etc, vc deve desfazer o q vc fez antes de finalizar o método.

Vê se funciona!

Falow!

C

davidbuzatto:
Kra, tenta desfazer a transformação antes de finalizar o método.
A transformação ta sendo mantida, e quando o método paintComponent é chamado denovo é feita uma nova tranformação em cima da anterior. Sempre quando vc usar transformações, mudanças de coordenadas, rotações, etc, vc deve desfazer o q vc fez antes de finalizar o método.

Vê se funciona!

Falow!

Realmente, dei mole, tinha até na API…na verdade errei em 2 pontos…

  1. tinha que voltar para a transformação original
  2. o setTransform não era pra ser usado no meio do código e sim apenas o transform
// Get the current transform
 AffineTransform saveAT = g2.getTransform();
 // Perform transformation
 g2d.transform(...);
 // Render
 g2d.draw(...);
 // Restore original transform
 g2d.setTransform(saveAT);

valeu

Criado 23 de junho de 2006
Ultima resposta 26 de jun. de 2006
Respostas 4
Participantes 3