Desenho polimórfico

E aê galera, blz?
Estou tendo dificuldades com desenhos polimórficos.
Eu criei uma classe abstrata chamada Desenho e mais duas outras chamadas de Circulo e Retangulo, que extendem a classe abstrata Desenho.
Eu implementei polimorficamente as clases Circulo e Retangulo, mas isso funcionou em JFrames diferentes.
Quando tentei implementar o Circulo e Retangulo no mesmo JFrame não deu erro, mas só apareceu um deles.
A clase Desenho é essa:

[code]import java.awt.;
import javax.swing.
;

public abstract class Desenho extends JPanel
{
public abstract void desenho(Graphics g);

public void paintComponent(Graphics g)
  {
     super.paintComponent(g);
     desenho(g);
  }

}[/code]

A classe Retangulo é:

[code]import java.awt.;
import javax.swing.
;

public class Retangulo extends Desenho
{
public void desenho(Graphics g)
{
g.drawRect(10, 10, 50, 50);
}
}[/code]

E a classe Circulo:

[code]import java.awt.;
import javax.swing.
;

public class Circulo extends Desenho
{

 public void desenho(Graphics g)
   {
     g.drawOval(10, 70, 40, 40);
   }

}[/code]

E por fim, na classe Main, eu criei um JFrame, instanciei as classes Circulo e Retangulo e os adicionei ao frame:
add(circ.desenho(g)), add(rect.desenho(g)), mas só um dels aparece!

[code]import javax.swing.;
import java.awt.
;

public class Main extends JFrame
{
Retangulo rect;
Circulo circ;

  public Main()
    {
         rect = new Retangulo();
         circ = new Circulo();    
         this.setSize(500, 500);
         this.setVisible(true);
         this.add(rect);
         this.add(circ);         
    }

public static void main(String args[])
    {
      Main m = new Main();
    } 

}[/code]
Pensei em transformar a classe desenho em interface, mas não dá.
Alguém pode me ajudar?

  1. Nunca, jamais, ever, chame setVisible no construtor. Isso pode fazer com que sua janela fique visível antes de ser completamente criada, como no caso do seu exemplo. Isso também tira da possibilidade de quem cria a janela a chance de decidir quando ela fica visível.
  2. Você deve definir o layout do seu JFrame como um GridLayout, ou como algum outro layout manager que mantenha os dois paineis abertos e visíveis (GridBagLayout, GroupLayout).

[code]
import javax.swing.;
import java.awt.
;

public class Main extends JFrame {
Retangulo rect;
Circulo circ;

public Main() {
    rect = new Retangulo();
    circ = new Circulo();    
    setSize(500, 500);
    setLayout(new GridLayout(2,1));
    add(rect);
    add(circ);         
}

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

}[/code]

Quase esqueço. Dê uma lida nos tutorias de Java do Ponto V:
http://www.pontov.com.br/site/index.php/java

Dão muitas dicas preciosas de Java 2D. Algumas práticas, se não obedecidas, podem fazer sua aplicação não funcionar como vc espera.

Vini,
Sua correção funcionou, valeu mesmo! :stuck_out_tongue: Agora não preciso mais enfiar todos os gráficos em um unico método paintComponent(ficava um verdadeiro “tripão procedural”)
Na verdade eu tinnha inserido o setLayout(new FlowLayout()), mas ele simplesmente apagava tudo, então eu imaginei que qualquer gerenciador de Layout’s faria o mesmo! :oops:
Em relação a sua dica sobre o setVisible, eu estranhei um pouco pois antigamente eu o usava da maneira como voçe fez, mas era aí que eu tinha problemas com componentes que não renderizavam!
Quanto ao PONTOV eu estava consultando esses dias, pois eu fiz um jogo e criei um método temporizador:

public void temporizador() { try { Thread.sleep(1000); } catch(InterruptedException e){} }
Mas a Thread danada “travava” tudo! A solução foi usar Thread com classe anônima, ficou feio mas funcionou :wink:

Mais uma vez Vini, muito obrigado!!

O sleep não é um temporizador. Ele é um método que faz a Thread atual parar por alguns segundos. Se você chamou na thread do Swing, você a congelou.
No Ponto V, na sessão de Java2D, tem um artigo que fala exclusivamente sobre temporização e o game loop, e tem lá uma versão refatorada do algorótimo do Killer Game Programming in J.ava. É um algorítmo muito bom.