Como usar uma thread

6 respostas
juliana_cora

Estou fazendo um semáforo, e consegui fazer mudar de cor só que não estou conseguindo quando clicar no botão parar....

Segue uma parte do programa ......

public void run()
    {
        poste();
        //for infinito
        for (;;)
        {
            while(getStatus()==1)
            {
                for (int i=1; i<=3; i++)
                {
                    if (i==1)
                    {
                        //vermelho
                        setCor(1);
                        //moveCores posição y
                        moveCores(55);
                    }
                    else if (i==2)
                    {
                        //verde
                        setCor(2);
                        moveCores(85);

                    }
                    else if (i==3)
                    {
                        //laramja
                        setCor(3);
                        moveCores(115);
                    }

                    cores();

                    try
                    {
                        Thread.sleep(999);
                    }
                    catch (InterruptedException ie) {}

                    limparCor();
                }
            }
        } 
    }

6 Respostas

T

E como é a implementação do botão parar?

juliana_cora
thingol:
E como é a implementação do botão parar?
public void actionPerformed(ActionEvent evento)
    {
        
        if(evento.getSource()==bIniciar)
        {
            novoSemaforo2 inicio = new novoSemaforo2(canvas);
            inicio.pararSemaforo(1);
            inicio.start();
        }

        if(evento.getSource()==bParar)
        {
            novoSemaforo2 inicio1 = new novoSemaforo2(canvas);
            inicio1.pararSemaforo(2);
            
  

        }

        if(evento.getSource()==bSair)
        {
            System.exit(0);
        }

    }
T

Hum… poste a implementação da classe novoSemaforo2.

(Dica: não comece nomes de classes por minúsculas; isso confunde a quem vai ler seu código. Inicie nomes de classes por maiúsculas e nomes de métodos por minúsculas).

juliana_cora
thingol:
Hum... poste a implementação da classe novoSemaforo2.

(Dica: não comece nomes de classes por minúsculas; isso confunde a quem vai ler seu código. Inicie nomes de classes por maiúsculas e nomes de métodos por minúsculas).

Obrigada pela dica......

class novoSemaforo2 extends Thread
{
    private JPanel canvas;
    private int cor;
    private int y;
    private static final int tamanhoBola = 30;
    private int status;


    public novoSemaforo2(JPanel canvas)
    {
        this.canvas = canvas;
    }

    public void run()
    {
        poste();
        //for infinito
        for (;;)
        {
            while(getStatus()==1)
            {
                for (int i=1; i<=3; i++)
                {
                    if (i==1)
                    {
                        //vermelho
                        setCor(1);
                        //moveCores posição y
                        moveCores(55);
                    }
                    else if (i==2)
                    {
                        //verde
                        setCor(2);
                        moveCores(85);

                    }
                    else if (i==3)
                    {
                        //laramja
                        setCor(3);
                        moveCores(115);
                    }

                    cores();

                    try
                    {
                        Thread.sleep(999);
                    }
                    catch (InterruptedException ie) {}

                    limparCor();
                }
            }
        } // run()
    }

    public void moveCores(int posicao)
    {
        y = posicao;
    } // move

    public void poste()
    {
        Graphics p = canvas.getGraphics();
        p.fill3DRect(100, 50, 40, 100, false);
        p.draw3DRect(100, 50, 40, 100, false);
    }

    public void cores()
    {
        Graphics g = canvas.getGraphics();
        if (getCor()==1)
        {
            g.setColor(Color.red);
        }
        
        else if (getCor()==2)
        {
            g.setColor(Color.GREEN);
        }

        else if (getCor()==3)
        {
            g.setColor(Color.orange);
        }

        g.fillOval(105, y, tamanhoBola, tamanhoBola);
    }


    public void limparCor()
    {
        Graphics g = canvas.getGraphics();
        g.setColor(Color.BLACK);
        g.fillOval(105, y, tamanhoBola, tamanhoBola);
    }


    public void pararSemaforo(int status)
    {
        setStatus(status);

    }

    /**
     * @return the cor
     */
    public int getCor() {
        return cor;
    }

    /**
     * @param cor the cor to set
     */
    public void setCor(int cor) {
        this.cor = cor;
    }

    /**
     * @return the status
     */
    public int getStatus() {
        return status;
    }

    /**
     * @param status the status to set
     */
    public void setStatus(int status) {
        this.status = status;
    }
}
T

Hum… não é a thread que tem de desenhar alguma coisa. Do jeito que você fez, a máquina deve estar ocupando 100% de CPU (ou 50% em uma máquina com 2 núcleos :slight_smile: ) e então não tem tempo de atender aos eventos de botões.
Você tem de criar um componente (derivado de JComponent, talvez), inseri-lo na sua tela, e redefinir seu método paintComponent.
Quando você precisa mexer no desenho, altere apenas as variáveis que são necessárias para efetuar o desenho, e então chame o método repaint desse componente.

juliana_cora

thingol:
Hum… não é a thread que tem de desenhar alguma coisa. Do jeito que você fez, a máquina deve estar ocupando 100% de CPU (ou 50% em uma máquina com 2 núcleos :slight_smile: ) e então não tem tempo de atender aos eventos de botões.
Você tem de criar um componente (derivado de JComponent, talvez), inseri-lo na sua tela, e redefinir seu método paintComponent.
Quando você precisa mexer no desenho, altere apenas as variáveis que são necessárias para efetuar o desenho, e então chame o método repaint desse componente.

Obrigada pela dica…vou tentar mudar aqui…

Qualquer coisa volto aqui…

Criado 24 de agosto de 2009
Ultima resposta 24 de ago. de 2009
Respostas 6
Participantes 2