Bom Dia a todos,
Bem como de costume, meu projeto de atualização de imagens deu problema, como havia dito no outro tópico, estou fazendo um projeto que utiliza um metodo de movimentação de imagens para simular o movimento do mesmo
a classe responsável pelo movimento é essa
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author UFABC
*/
public class Simulador {
JFrame janela = new JFrame();
int contg, cont;
Imagens imagem;
int a = 0, b = 0, c = 0, d = 0, x, xx, y, x2, y2, esc;
public void criaJanela() {
// janela = new JFrame();
janela.setLayout(null); // origem: coordenada (0,0) canto superior esquerdo
janela.setBounds(0, 0, 600, 800);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.getContentPane().setBackground(Color.WHITE);
janela.setTitle("Simulador");
janela.setVisible(true);
}
public void carregaImagem(JPanel janela) {
// imagem = new Imagens("robo.jpg");
// imagem = new Imagens("robo2.gif");
//janela.add(imagem);
}
// tela sendo JFrame
public void carregaImagem2(JPanel janela) {
imagem = new Imagens("robo1.gif");
janela.removeAll();
janela.setVisible(false);
janela.setVisible(true);
janela.add(imagem);
imagem = new Imagens("robo1.gif");
janela.add(imagem);
}
public void guarda1() {
}
public void moveImagemx1() {
imagem.setX(imagem.getX() + 10);
imagem.setIcon(imagem.getIcon());
imagem.setVisible(false);
imagem.setVisible(true);
a++;
}
public void moveImagemy1() {
imagem.setY(imagem.getY() + 10);
imagem.setIcon(imagem.getIcon());
b++;
}
public void moveImagemx2() {
imagem.setX(imagem.getX() + (-10));
imagem.setIcon(imagem.getIcon());
c++;
}
public void moveImagemy2() {
imagem.setY(imagem.getY() + (-10));
imagem.setIcon(imagem.getIcon());
d++;
}
public void geral(final int x) {
new Thread() {
int xtemp = x, contimg = 0;
@Override
public void run() {
do {
moveImagemx1();
imagem.repaint();
if (contimg == 0) {
imagem.setVisible(false);contimg++;
} else {
imagem.setVisible(true);
}
try {
Thread.sleep(100);
} catch (Exception ea) {
} // atrasa um pouco
if (a == x) {
xtemp = 0;
a = 0;
}
} while (a < xtemp);
}
}.start();
}
}[/code]
e a sua aaplicação na classe interf. JFrame é essa
[code] s1.carregaImagem2(jPanel3);
s1.geral(Integer.parseInt(jTextField1.getText()));
o problema é que quando eu mando executar o programa ele mantem a imagem por onde ele passou, como se a tela tivesse suja, mesmo que não tivesse mais imagem lah …
EX.
Onde saiu e onde esta o rastro…verdadeiro e ponto final do algoritmo de posição
|…|
/…/
…
Alguem sabe me dizer como resolver isso ?
Grato Guilherme
o metodo para atualizar jFrame, JPanel, e Image é o repaint() ???
AJUDA por favor
Ok, você pegou um caminho tão errado, que não vale a pena corrigir esse programa. Do jeito que está, mesmo que você corrija o código e faça a imagem “se mover”, no mínimo, você ainda terá problemas com flickering.
Você precisa ler urgentemente esse tutorial:
Space Invaders - An Accelerated Java 2D Tutorial
Apesar dele ser relacionado a games, ele ensina a usar imagens da maneira correta, e a usar com efetividade os métodos do Java 2D.
Depois, se ainda tiver problemas, a gente conversa. 
Sim. O repaint() envia um comando de redesenho para a fila do Swing. O Swing está autorizado a ignorar vários comandos de repaint seguidos. Isso é chamado de “event coalescing”, e é particularmente útil na programação de interfaces gráficas, embora seja péssimo para quem queira fazer animações, simuladores ou jogos.
Por isso, a melhor maneira de fazer o que você quer é com active drawing. Ou seja, desenhar em cima do buffer propositalmente e dizer você mesmo quando o buffer deve ser exibido. O tutorial acima explica como fazer isso.
Uma pergunta rápida, na minha aplicação o problema não é mesmo flickering, já que o que acontece é o que esta escrito no mini tutorial que vc acabou de me passar sobre o mesmo, fazer a pintar não funcionaria ?
OBS. irei ler agora o tutorial de jogos, essa questão acima é apenas para situação didática, para intender melhor sobre o assunt
Grato por tudo
Boa noite a todos,
Fiz tudo o que foi possível para intender o que você disse moderador, e após refletir um pouco e pela minha falta de tempo em organizar esse projeto, resolvi tentar manipular o swing ao invés de usar toda a interface grafics - AWT como o moderador falou acima, de certa forma fiz umas alterações e consegui apagar o rastro.
Como?
Como o moderador falou o problema era a aplicatividade de imagem em swing dentro de threads (thread do swing estar livre), para isso resolvi utilizar a imagem no
método principal inicialmente como setVisible(false) com isso a fila do swing começa sem a imagem inicial impedindo o (meio) flickering que ocorria o primeiro imagem.setVisible(true); estava dentro do thread, com isso a imagem não tinha como ficar presa no inicio da tela e resolvendo meu problema.
Código
[code]import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
-
@author UFABC
*/
public class Simulador {
JFrame janela = new JFrame();
int contg, cont;
Imagens imagem, imagem2;
int a = 0, b = 0, c = 0, d = 0, x, xx, y, x2, y2, esc;
public Simulador() {
//createBufferStrategy(2);
}
public void criaJanela() {
// janela = new JFrame();
janela.setLayout(null); // origem: coordenada (0,0) canto superior esquerdo
janela.setBounds(0, 0, 600, 800);
janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
janela.getContentPane().setBackground(Color.WHITE);
janela.setTitle("Simulador");
janela.setVisible(true);
}
public void paint(Graphics g) {
Graphics tela = g.create();
//Aqui vai o seu código normal
tela.dispose();
}
public void carregaImagem(JPanel janela) {
imagem2 = new Imagens(“robo2.gif”);
janela.add(imagem2);
imagem2.setVisible(true);
}
// tela sendo JFrame
public void carregaImagem2(JPanel janela) {
imagem = new Imagens(“robo1.gif”);
janela.removeAll();
janela.setVisible(true);
janela.add(imagem);
janela.add(imagem);
}
public void guarda1() {
}
public void moveImagemx1() {
imagem.setVisible(false);
imagem.setX(imagem.getX() + 10);
a++;
}
public void moveImagemy1() {
imagem.setY(imagem.getY() + 10);
b++;
}
public void moveImagemx2() {
imagem.setX(imagem.getX() + (-10));
c++;
}
public void moveImagemy2() {
imagem.setY(imagem.getY() + (-10));
d++;
}
public void geral(final int x) {
new Thread() {
int xtemp = x, ytemp = x, contimg = 0;
@Override
public void run() {
do {
moveImagemx1();
imagem.setVisible(true);// momento em que a imagem realmente aparece
try {
Thread.sleep(100);
} catch (Exception ea) {
} // atrasa um pouco
if (a == x) {
xtemp = 0;
a = 0;
}
} while (a < xtemp);
do {
moveImagemy1();
imagem.setVisible(true);// momento em que a imagem realmente aparece
try {
Thread.sleep(100);
} catch (Exception ea) {
} // atrasa um pouco
if (b == x) {
ytemp = 0;
b = 0;
}
} while (b < ytemp);
}
}.start();
}
}
[/code]
e a da classe principal
this.repaint();
s1.carregaImagem2(jPanel3);
s1.imagem.setVisible(false);//desvisualizando a imagem antes do thread ser aberto
s1.geral(Integer.parseInt(jTextField1.getText()));
Quando tiver mais tempo e não estiver mais sobre pressão de carga horaria tentarei fazer pela teoria de jogos em 2D, mas no momento acabaria me atrapalhando refazer todo o projeto e as interfaces gráficas, principalmente que não sou especialista no assunto, quando possivel faço da maneira apropriada e coloco como resolvido, no momento vou colocar como semi resolvido
Grato ao moderador pelos tutoriais