Acontece q vc ta tentando fazer algo complicado com pouco conhecimento em java
São necessárias duas classes, uma é a Janela(JanelaPrincipal) e a outra a area q será desenhada PanelDesenho
[code]import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class JanelaPrincipal extends JFrame
{
public JanelaPrincipal()
{
JanelaPrincipal frame = new JanelaPrincipal();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//obtém as dimensões da tela
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
//centraliza o frame na tela
setSize(screenWidth / 2, screenHeight / 2);
setLocation(screenWidth / 4, screenHeight);
}
public void atualiza()
{
this.repaint();
}
}
[/code][code]public class PanelDesenho extends JPanel {
private BufferedImage buffer;
public PanelDesenho(int largura, int altura) {//define a area q sera desenhada
buffer = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
setPreferredSize(new Dimension(largura, altura));
Controle.getInstancia().setTelaDesenho(this);//necessario para dar o repaint()
}
public Graphics2D obterGraphics() {
return buffer.createGraphics();//obtem o graphics
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(buffer, 0, 0, null);
}
// add isso
//pinta toda a imagem de branco
public void limparBuffer() {
if (buffer != null) {
Graphics2D g2d = buffer.createGraphics();//obtem o graphics
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, buffer.getWidth(null), buffer.getHeight(null));//limpa o buffer
g2d.dispose();
}
}[/code][quote]Animacao - Classe Abstract apenas com o método anima() também abstrato e o atributo se está ativa ou não a animação. [/quote]
Em algum lugar isso tem q ser implementado
Cria e desenha o no, provavelmente sera chamado no Thread
Fiz algumas alterações
[code]package controle.animacao;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
public class NoGrafico
{
private No no;
private int x ;
private int y ;
private final int a = 90;
private final int l = 80;
public No getNo() {
return no;
}
public void setNo(No no) {
this.no = no;
}
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;
}
public synchronized Point getPosicao(){
Point retorno = new Point();
retorno.x = x;
retorno.y = y;
return retorno;
}
public void desenha(Graphics2D g2d)
{
if (no!=null)
{
Font font = new Font("monospaced", Font.PLAIN, 8);
FontMetrics metrics= g2d.getFontMetrics();
int tamanhoHorizontal = metrics.charsWidth(no.str.toCharArray(), 0, no.str.length());
int tamanhoVertical = metrics.getHeight();
g2d.drawRect(getX(), getY(), tamanhoHorizontal +2*no.getBordahorizont(),tamanhoVertical);
g2d.drawString(no.str, getX()+no.getBordahorizont(), getY()+tamanhoVertical);
}
}
}[/code][quote]Controle - Controla todos os componentes do projeto, essa classe é quem distribui o que vai fazer o que e na ordem certa, também temos o controle [/quote][code]package controle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.List;
import controle.animacao.ControleAnimacao;
import controle.animacao.No;
import controle.animacao.NoGrafico;
public class Controle {
private int posicaoXAtual, posicaoYAtual;
private static Controle instancia = new Controle();
private List<NoGrafico> desenhosNos;
private static final int PAUSA_ANIMACAO = 300;
public Controle(){
posicaoXAtual = 200;
posicaoYAtual = 200;
NoGrafico no = null;
no.setX(posicaoXAtual);
no.setY(posicaoYAtual);
}
public void CriaNo(No no){
//Cria o No Grafico associado
//Associa uma animacao a ele
//Coloca na lista de animacoes
}
public void RemoveNo(No no){
}
public static Controle getInstancia() {
return instancia;
}
private PanelDesenho tela;
public void setTelaDesenho(PanelDesenho tela) {
this.tela = tela;
}
//Este método deve ser utilizado no método de desenho para atualizar as imagens
//o ideal é rodá-lo dentro de uma Thread...
public void desenhaNos(){
tela.limparBuffer();//pinta tudo de branco
Graphics2D g = tela.obterGraphics();
ControleAnimacao controleAnimacao = ControleAnimacao.getInstancia();
//Dispara as animacoes
controleAnimacao.anima();
//Desenha os nos após animados
synchronized(desenhosNos){
for (NoGrafico no:desenhosNos){
no.desenha(g);
}
}
g.dispose();
tela.repaint();//avisa q a imagem foi alterada
}
}[/code][code]public class ThreadDaAplicacao extends Thread {
public void run() {
while(true) {//loop infinito
Controle controle = Controle.getInstancia();
controle.desenhaNos();
Thread.sleep(TEMPO DE ESPERA);
}
}
}[/code]
agora o main
public static void main(String[] args) {
JanelaPrincipal jp = new JanelaPrincipal();
PanelDesenho pd = new PanelDesenho(500,500);
jp.getContentPane().add(pd);
jp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jp.pack();
jp.setVisible(true);
ThreadDaAplicacao t = new ThreadDaAplicacao();
t.start();
}
as outras classes, axo q n precisam ser alteradas, axo q com isso ja ada pra fzar funcionar