Ola!
To tentando exibir uma sequencia de imagens com JLabel, mas tenho um pc de dois core, nucleos, e mesmo usando “synchronized”, quando vou exibir as imagens a tela fica divida ao meio com duas imagens partidas, em vez de exibir uma imagem completa.
Quando testo em um pc de um nucleo somente é exibido normal a execuçao.
Como devo usar esse synchronized no meu caso ou não é esse o problema?
Caso tenha necessidade eu posto meu codigo.
vlw!
Posta o código ai. Isso não deveria ocorrer(até onde sei).
Seria legal vc postar seu código também.
public synchronized void run() {
// barraProgresso.setValue(0);
// barraProgresso.setStringPainted(true);
// this.aux.setText("");
// Passando os dados de XML para Objetos Java
try {
this.stream.fromXML(new FileInputStream("g:\arquivo.xml"), this.arquivo);
} catch (FileNotFoundException ex) {
Logger.getLogger(ThreadFilme.class.getName()).log(Level.SEVERE, null, ex);
}
//System.out.println(arquivo.getCpu());
// Inicializando a posiçao
pos = 1;
// this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + "00" + pos + ".jpg");
// this.aux.setIcon(icone);
// Processo de Execução
synchronized (this) {
while (estado != "stop") {
// Estado igual a PLAY
if (estado == "play") {
barraProgresso.setValue(barraProgresso.getValue() + 1);
// Comparacoes dos nome dos videos
if (pos >= 100) {
this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + pos + ".jpg");
this.aux.setIcon(icone);
//this.player.setjLabel1(icone);
pos++;
frames++;
} else if (pos >= 10) {
this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + "0" + pos + ".jpg");
this.aux.setIcon(icone);
//this.player.setjLabel1(aux);
pos++;
frames++;
} else {
this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + "00" + pos + ".jpg");
this.aux.setIcon(icone);
//this.player.setjLabel1(this.icone);
pos++;
frames++;
}
try {
sleep((long) arquivo.getPrazo());
} catch (InterruptedException e) {
}
this.barraProgresso.setVisible(true);
// Execução Concluída
if (pos == 686) {
this.setEstado("stop");
this.setBarraProgresso(0);
this.setPos(0);
this.stop();
}
SimpleDateFormat formato = new SimpleDateFormat("mm:ss");
System.out.println(frames + "=@=" + formato.format(new Date()));
// Estado igual a PAUSE
} else if (estado == "pause") {
try {
this.yield();
sleep((long) 1000);
} catch (InterruptedException ex) {
Logger.getLogger(ThreadFilme.class.getName()).log(Level.SEVERE, null, ex);
}
// Estado igual a FORWARD
} else if (estado == "fwd") {
barraProgresso.setValue(barraProgresso.getValue() + 5);
// Comparacoes dos nome dos videos
if (pos >= 100) {
this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + pos + ".jpg");
this.aux.setIcon(icone);
//this.player.setjLabel1(icone);
pos = pos + 5;
frames++;
} else if (pos >= 10) {
this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + "0" + pos + ".jpg");
this.aux.setIcon(icone);
//this.player.setjLabel1(aux);
pos = pos + 5;
frames++;
} else {
this.icone = new ImageIcon(arquivo.getEnderecoBuffer() + "00" + pos + ".jpg");
this.aux.setIcon(icone);
//this.player.setjLabel1(this.icone);
pos = pos + 5;
frames++;
}
try {
sleep((long) (arquivo.getPrazo() - 10));
} catch (InterruptedException e) {
}
this.barraProgresso.setVisible(true);
// Execução Concluída
if (pos >= 686) {
this.setEstado("stop");
//this.setBarraProgresso(0);
this.setPos(0);
this.stop();
}
cortei o pedaço da execuçao do codigo de exebiçao pra poderem ver…faltando uma parte do final e fechar alguns metodos.
mas se resume nessas chamadas, eu to lendo do xml, e exibindo a imagem com um JLabel aux = new JLabel();
detalhe: essa thread recebe por paramentro um label no construtor:
public ThreadFilme(JLabel aux1, JProgressBar progress) {
//super();
this.aux = aux1;
//this.arquivo = arq;
this.barraProgresso = progress;
this.setEstado("play");
this.start();
// super(str);
}
apartir daqui ele executa…acho que agora ta melhor explicado neh…hehe
vlw!
Ops, não vi que era novo no fórum. Pode editar o tópico acima usando essas dicas aqui?
http://www.guj.com.br/posts/list/50115.java
Senão vai ficar difícil ler…
Bom, você não deveria alterar atributos de label por fora da Thread do Swing. É para isso que existe o comando EventQueue.invokeLater().
Na verdade, já que você quer fazer animação, o ideal seria usar Java 2D diretamente. Você pode ver como se faz isso aqui:
http://fivedots.coe.psu.ac.th/~ad/jg/
me desculpe…mas agora ja editei o topico…
o que preciso é realmente fazer essa chamada…quando executo num pc com um nucleo é buscado o endereço no XML e exibido no label passado por parametro perfeitamente. O que não entendo é pq nao consigo exibir a tela normal num pc de dois nucleos.
As dicas que me passou estou dando uma olhada agora…sao formas muito melhores de trabalhar, mas no meu caso é um trabalho que foi pedido pra exibir imagens apartir de um XML, nao vejo muita necessidade de tentar alterar isso agora. O que precisava entender é o que o JLabel faz com a imagem de 512x218 quando vai exibi-la…uma imagem quadrada de 512x512 já é exibida normal tb. Fiz um teste e não aconteceu o mesmo que a imagem retangular.
Vo fazer alguns testes, mas de toda forma essa dica do JAVA 2D achei muito interessante. Vou estuda-la depois…
Deixo aqui uma imagem de exibição do problema:
Então, tente trocar essa linha:
this.aux.setIcon(icone);
Por essa:
EventQueue.invokeLater(new Runnable() {
public void run() {
aux.setIcon(icone);
}
});
Engraçado seu screenshot pareceu um player de vídeo. Se for para parecer vídeo mesmo, você vai ser obrigado a usar o Java2D. Isso pq o Swing pode ignorar eventos de repaint, caso ocorram muito próximos um do outro.
troquei a linha e continua com o problema…to achando que pode ser esse evento de repaint …algo que o netbeans faz internamente para exibir que com uma imagem retangular ocorre esse erro. Acho que vo tentar criar isso com JAVA 2D depois…mas preciso estudar isso antes…nao conheço ainda…
mas mesmo assim agradeço demais a ajuda, otimas dicas…acho que vo solucionar isso somente testando uma tela diferente quadrada ou executando em um nucleo so mesmo…
vlw mesmu!
Ola pessoal, estou fazendo uma classe que faz uma imagem em escala de cinza apartir de uma imagem colorida. Essa classe cria outra imagem portanto fica a colorida e sua copia em escala de cinza. Mas estou com problemas para exibir essas duas imagens no mesmo jframe alguem poderia me ajudar com isso … Obrigada