Criação de novo componente

Bom dia,

Preciso de um componente Swing similar ao que esta em anexo.

O que esta em anexo, eu desenvolvi criando uma classe que extende JComponent e sobrescreve o método “paint(Graphics g)”, observem abaixo:

[code]import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.BorderFactory;
import javax.swing.JComponent;

public class PIVCubo3D extends JComponent {

private PIVCubo3DFactory factory;

private final int LARGURA;
private final int PROFUNDIDADE;

private final int COMPLINHA;

public PIVCubo3D(final int LARGURA, final int PROFUNDIDADE, final int COMPLINHA) {
	super( );
	this.LARGURA = LARGURA;
	this.PROFUNDIDADE = PROFUNDIDADE;
	this.COMPLINHA = COMPLINHA;
	setPreferredSize(new Dimension(350,350));
	setBorder(BorderFactory.createLineBorder(Color.RED));
}

@Override
public void paint(Graphics g) {
	Graphics2D g2d = (Graphics2D) g;
	g2d.setColor(Color.RED);
	factory = new PIVCubo3DFactory(g2d, 200, 200);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.primCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxFrenteCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxFrenteCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	factory.desenhaCubo(PIVCubo3DFactory.TipoCubo.proxLadoCubo);
	
	factory.pintaCubo(PIVCubo3DFactory.TipoCubo.primCubo);
}

}[/code]

Juntamente com o criador de cubos PIVCubo3DFactory:

[code]import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Line2D.Float;

public class PIVCubo3DFactory {

private Graphics2D g2d;

private final int startX , startY;

private int ancoraX , ancoraY;

private int coordX, coordY;
private int coordXMemento, coordYMemento;

private int tamLinha = 20;

private Float coordenadas;

private int fileira;

public PIVCubo3DFactory(Graphics2D g2d, int startX, int startY) {
	this.g2d = g2d;
	this.startX = startX;
	this.startY = startY;
	this.coordX = this.startX;
	this.coordY = this.startY;
}

public void pintaCubo(TipoCubo tipoCubo) {
	switch(tipoCubo) {
		case primCubo:
			g2d.setColor(Color.BLUE);
			g2d.fillRect(startX-tamLinha+1, startY-tamLinha+1, tamLinha-1, tamLinha-1);
			break;
	}
}

public void desenhaCubo(TipoCubo tipoCubo) {
	switch (tipoCubo) {
	case primCubo:
		coordenadas = new Float();
		linhaRetaBaixoCima();
		coordXMemento = coordX;
		coordYMemento = coordY;
		linhaDiagonalBaixoCima();
		ancoraX = coordX;
		ancoraY = coordY;
		linhaRetaCimaBaixo();
		linhaDiagonalCimaBaixo();
		linhaRetaDireitaEsquerda();
		linhaRetaBaixoCima();
		linhaDiagonalBaixoCima();
		linhaRetaEsquerdaDireita();
		coordX = coordXMemento;
		coordY = coordYMemento;
		linhaRetaDireitaEsquerda();
		fileira = 1;
		break;
	case proxLadoCubo:
		if( fileira == 1 ) {
			coordenadas = new Float();
			linhaRetaDireitaEsquerda();
			coordXMemento = coordX;
			coordYMemento = coordY;
			linhaRetaCimaBaixo();
			linhaRetaEsquerdaDireita();
			coordX = coordXMemento;
			coordY = coordYMemento;
			linhaDiagonalBaixoCima();
			linhaRetaEsquerdaDireita();
			coordX = coordXMemento;
			coordY = coordYMemento;
		} else {
			linhaRetaDireitaEsquerda();
			coordXMemento = coordX;
			coordYMemento = coordY;
			linhaDiagonalCimaBaixo();
			coordX = coordXMemento;
			coordY = coordYMemento;
		}
		break;
	case proxFrenteCubo:
		coordenadas = new Float();
		coordX = ancoraX;
		coordY = ancoraY;
		linhaDiagonalBaixoCima();
		ancoraX = coordX;
		ancoraY = coordY;
		coordXMemento = coordX;
		coordYMemento = coordY;
		linhaRetaCimaBaixo();
		linhaDiagonalCimaBaixo();
		coordX = coordXMemento;
		coordY = coordYMemento;
		linhaRetaDireitaEsquerda();
		coordXMemento = coordX;
		coordYMemento = coordY;
		linhaDiagonalCimaBaixo();
		coordX = coordXMemento;
		coordY = coordYMemento;
		fileira ++;
		break;
	}
}

private void linhaRetaEsquerdaDireita( ) {
	coordenadas.setLine(coordX,coordY,(coordX += tamLinha),coordY);g2d.draw(coordenadas);
}

private void linhaRetaDireitaEsquerda( ) {
	coordenadas.setLine(coordX,coordY,(coordX -= tamLinha),coordY);g2d.draw(coordenadas);
}

private void linhaRetaBaixoCima( ) {
	coordenadas.setLine(coordX,coordY,coordX,(coordY -= tamLinha));g2d.draw(coordenadas);
}

private void linhaRetaCimaBaixo( ) {
	coordenadas.setLine(coordX,coordY,coordX,(coordY += tamLinha));g2d.draw(coordenadas);
}

private void linhaDiagonalCimaBaixo( ) {
	coordenadas.setLine(coordX,coordY,(coordX -= tamLinha / 2),(coordY += tamLinha / 2));g2d.draw(coordenadas);
}

private void linhaDiagonalBaixoCima( ) {
	coordenadas.setLine(coordX,coordY,(coordX += tamLinha / 2),(coordY -= tamLinha / 2));g2d.draw(coordenadas);
}

public enum TipoCubo {
	primCubo, proxLadoCubo, proxFrenteCubo
}

}[/code]

Para desenhar os cubos, até que foi fácil, porém eu gostaria de preenche-los também, com alguma cor, ai ja fica um pouco mais complicado…

Alguém tem alguma dica de componente pronto similar ao que estou querendo ou poderia me aconselhar sobre como criar o meu de maneira um pouco mais prática ?

Att,