Como usar uma thread

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 …

[code]public void run()
{
poste();
//for infinito
for (;:wink:
{
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();
            }
        }
    } 
}[/code]

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

[code]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);
    }

}[/code]

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).

[quote=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).[/quote]

Obrigada pela dica…

[code]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;
}

}[/code]

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.

[quote=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.
[/quote]

Obrigada pela dica…vou tentar mudar aqui…

Qualquer coisa volto aqui…