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
Hmm, estranho, fiz um teste aqui e ficou o meu desenho no JFrame… olha como fiz:
[code]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);
}
}
[/code]
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.
É… 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:
[code]
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());
}
}
}[/code]
o circle antes da transformada mantem…nao tendi…ta brabo
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!
[quote=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![/quote]
Realmente, dei mole, tinha até na API…na verdade errei em 2 pontos…
- tinha que voltar para a transformação original
- 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