AJUDA com interface problematica ....[RESOLVIDO]

5 respostas
G

Boa tarde/noite

Bom estou fazendo um projeto e para melhor aplicação fiz um simulador que muda a posição dos frames pelo algoritmo

mas por algum motivo trava a tela e só aparece a posição final do desenho que eu utilizo

o código deve estar pesado ... sei lah não sei como resolver ... alguem sabe o que esta acontecendo

Abaixo esta a classe que faz o bonequinho se mexer

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);
    }

    public void carregaImagem2() {
//        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);
        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(int x) throws InterruptedException {
        do {
            
            moveImagemx1();
            janela.repaint();
            try {
                Thread.sleep(1000);
            } catch (Exception ea) {
            }  // atrasa um pouco
            if (a == x) {
                x = 0;
                a = 0;
            }
        } while (a < x);




    }
}
e aqui esta o codigo base da main que o faz aparecer
try {

            s1.carregaImagem2();
            s1.criaJanela();
            s1.janela.setVisible(true);
            s1.geral(Integer.parseInt(jTextField1.getText()));

            // TODO add your handling code here:
        } catch (Exception xs) {
           
        }

por favor alguem me ajuda to ficando transtornado com isso

5 Respostas

L

Meu palpite é que está entrando em um laço eterno no seu do-while
Da uma verificada nos valores que estão entrando e sendo modificados em a e x no momento da execução do "do-while’ seu

G

Até entendo o caso do while infinito … mas nesse caso por que o projeto terminou o while depois de algum tempo … se ele fosse infinito não iria aparecer resultados

coca1na

realmente deve ser por causa do loop infinito…

tenta assim:

new Thread() {

                    @Override
                    public void run() {
                        do {

                            moveImagemx1();
                            janela.repaint();
                            try {
                                Thread.sleep(1000);
                            } catch (Exception ea) {
                            }  // atrasa um pouco  
                            if (a == x) {
                                x = 0;
                                a = 0;
                            }
                        } while (a < x);

                    }
                }
            }.start();

Ve se ajuda…

G

Funcionou !!!

muito obrigado, só uma pergunta de onde vc tirou essa ideia do thread e start, e o que ocorreu de diferente ?

Muito obrigado mesmo coca1na

ViniGodoy

O que ocorre é o seguinte. O repaint apenas empilha um evento na fila do Swing. Esse evento só será processado quando a thread do swing estiver livre.

Entretanto, o seu while rodava dentro da thread do swing. Ele empilhava vários repaints lá, mas não liberava a thread para que pudesse processa-los. O que o colega fez foi criar uma thread separada para o while.

A qualidade de sua aplicação gráfica dependerá exclusivamente de controlar bem esse loop. Note que máquinas diferentes poderão executar o método moveImagem() em velocidades diferentes, o que é muito esquisito. Existe duas maneiras de controlar isso:

  1. Controlando a taxa de execuções do loop em um único segundo. Ou seja, calculando o tempo que o loop levou e alterando o valor do sleep.
  2. Deixar a velocidade do loop variar, mas usar o tempo do loop como parâmetro para regular sua movimentação. Ou seja, somar o valor de “x” ou “y” numa movimentação por: x = 1 * diferençaDeTempoEntreDoisLoops;

A primeira abordagem é coberta nesse material aqui: http://fivedots.coe.psu.ac.th/~ad/jg/ch1/index.html
A segunda, no site que te passei no outro tópico: http://www.cokeandcode.com/node/6

Criado 10 de março de 2009
Ultima resposta 12 de mar. de 2009
Respostas 5
Participantes 4