Oi Gustavo,
Bem, acho que você está começando, então, vamos lá.
Se você tem uma superclasse comum (Shape), você pode-se valer do polimorfismo para "renderizar" as formas, sem precisar fazer essa comparação um pouco estranha do seu for. Digo estranha pois poderia ser feita de outra forma, usando o operador instanceof. Mas vamos a um exemplo:
Forma.java
import java.awt.Graphics2D;
/**
*
* @author David Buzatto
*/
public abstract class Forma {
// as classes filhas de Shape vão herdar as "propriedades" x e y (acessadas
// através dos métodos get e set
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
// método abstrato que será implementado pelas classes filhas,
// sendo que é na implementação específica que o algoritmo de desenho
// é executado
public abstract void drawMe( Graphics2D g2d );
}
Retangulo.java
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
/**
*
* @author David Buzatto
*/
public class Retangulo extends Forma {
private int largura;
private int altura;
public int getAltura() {
return altura;
}
public void setAltura(int altura) {
this.altura = altura;
}
public int getLargura() {
return largura;
}
public void setLargura(int largura) {
this.largura = largura;
}
// desenhando um retângulo...
@Override
public void drawMe( Graphics2D g2d ) {
Rectangle2D.Double r = new Rectangle2D.Double( getX(), getY(),
getLargura(), getAltura() );
g2d.draw( r );
}
}
Quadrado.java
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
/**
*
* @author David Buzatto
*/
public class Quadrado extends Retangulo {
public int getTamanho() {
return getLargura();
}
public void setTamanho(int tamanho) {
setLargura(tamanho);
}
// desenhando um quadrado...
@Override
public void drawMe( Graphics2D g2d ) {
Rectangle2D.Double r = new Rectangle2D.Double( getX(), getY(),
getTamanho(), getTamanho() );
g2d.draw( r );
}
}
Circulo.java
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
/**
*
* @author David Buzatto
*/
public class Circulo extends Forma {
private int raio;
public int getRaio() {
return raio;
}
public void setRaio(int raio) {
this.raio = raio;
}
// desenhando um círculo...
@Override
public void drawMe( Graphics2D g2d ) {
Ellipse2D.Double e = new Ellipse2D.Double( getX(), getY(), getRaio()*2, getRaio()*2 );
g2d.draw( e );
}
}
PainelDesenho.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
/**
*
* @author David Buzatto
*/
public class PainelDesenho extends JPanel {
// uma lista de formas
private List<Forma> lista;
public PainelDesenho() {
// instancia a lista
lista = new ArrayList<Forma>();
}
@Override
protected void paintComponent( Graphics g ) {
Graphics2D g2d = ( Graphics2D ) g;
g.setColor( Color.black );
g.fillRect( 0, 0, this.getWidth(), this.getHeight() );
g.setColor( Color.white );
// itera pela lista
for ( Forma f : lista ) {
// como todo mundo que herda de Forma implementa o método drawMe,
// quando chamar f.drawMe, o método correspondente à instância
// em questão será executado.
f.drawMe( g2d );
}
}
}
Note que você pode inserir outras propriedades na classe Forma, como a cor da forma, se ela deve ser desenha ou preenchida, se você tem uma cor de preenchimento e uma de contorno...
Enfim, são muitas as possibilidades.
Se não souber o que é polimorfismo, dê uma olhada nesse link: http://www.guj.com.br/posts/list/49267.java
Perceba como ficou muito mais simples fazer o que você precisa.
[]´s