Random... sortear numero [resolvido]

Galera, tenho que fazer um programa que sortea um número de 1 a 100.
esses números tem que ir passando numa Jlabel bem rápido e quando a pessoa clicar no botão para ele para no número sorteado.

Eu tentei fazer, só que num deu certo. Usei o for(…), só que ele fica num loop inifinito e num consigo clicar no botão
Alguém ai sabe como fazer?

Não tem jeito, só usando threads.

Veja se esse exemplo te ilumina:

[color=red][size=18]Se alguem achar que estou falando Besteria me corrija [/size] [/color]


david.jv, estou com uma dica de Código aqui para seu Problema:
É algo bem simples talvez exista uma solução melhor para este problema, mais vai ai:
[color=darkred]Classe Sorteio com uma variavel Global int num [/color]

public class Sorteio extends JLabel implements Runnable { int num; }

[color=darkred]No construtor vamos trabalhar com o texto da Label, as Threads e ação do Mouse[/color]
1 - Setando a configuração de Fonte do Label
2 - Instanciando um objeto do tipo Thread, com parametro [color=blue]this[/color], pois iremos implementar o método [color=blue]run[/color].
3 - Acionando uma parada da Thread ao Clicar com o Mouse.

[code]public Sorteio() {
setFont(new Font("", Font.BOLD, 100));
final Thread th = new Thread(this);
addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
th.stop();
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
});

    th.start();
}[/code]

[color=darkred] Vamos para a implementação do método [color=blue]run[/color] [/color].
1 - Temos que colocar um laço infinito nele para ele executar infinitamente (obvio)
2 - Colocar um tempo de parada para ele executar novamente (Este tempo é dado em Milisegundos.
3 - Devemos também tratar a exceção,
4 - Pode se ver que tem um método dentro chamado sorteio ele terá o papel de setar a variável [color=blue]num [/color],

public void run() { for (;;) { try { sorteia(); Thread.sleep(30); } catch (InterruptedException ex) { } } }

[color=darkred]Por fim fazer o metodo sorteio [/color]
Método que seta a label, e será executado dentro da run

[code]public void sorteia() {
if (num < 101) {
num++;
}
if (num == 101) {
num = 0;
}
setText(Integer.toString(num));

}[/code]

Agora so fazer um frame e estanciar um objeto do tipo Sorteio tentro, para que nao Haja duvida vou colocar aqui em baixo um teste
Testa ele no metodo main

public static void main(String[] args) { JFrame janela = new JFrame(); janela.add(new Sorteio()); janela.setBounds(300,300,400, 200); janela.setDefaultCloseOperation(3); janela.setVisible(true); } }

david.jv- De uma estudada mais afundo, na parte de Thread, ajudaria muito você a entender estas coisas.

[quote=ViniGodoy]Não tem jeito, só usando threads.

Veja se esse exemplo te ilumina:


Muito bom material!
:slight_smile:

dyeimys

Parabéns pelo post, da hora!!!
muito bom!

[quote=dyeimys][color=red][size=18]Se alguem achar que estou falando Besteria me corrija [/size] [/color]


david.jv, estou com uma dica de Código aqui para seu Problema:
É algo bem simples talvez exista uma solução melhor para este problema, mais vai ai:
[color=darkred]Classe Sorteio com uma variavel Global int num [/color]

public class Sorteio extends JLabel implements Runnable { int num; }

[color=darkred]No construtor vamos trabalhar com o texto da Label, as Threads e ação do Mouse[/color]
1 - Setando a configuração de Fonte do Label
2 - Instanciando um objeto do tipo Thread, com parametro [color=blue]this[/color], pois iremos implementar o método [color=blue]run[/color].
3 - Acionando uma parada da Thread ao Clicar com o Mouse.

[code]public Sorteio() {
setFont(new Font("", Font.BOLD, 100));
final Thread th = new Thread(this);
addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
th.stop();
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
});

    th.start();
}[/code]

[color=darkred] Vamos para a implementação do método [color=blue]run[/color] [/color].
1 - Temos que colocar um laço infinito nele para ele executar infinitamente (obvio)
2 - Colocar um tempo de parada para ele executar novamente (Este tempo é dado em Milisegundos.
3 - Devemos também tratar a exceção,
4 - Pode se ver que tem um método dentro chamado sorteio ele terá o papel de setar a variável [color=blue]num [/color],

public void run() { for (;;) { try { sorteia(); Thread.sleep(30); } catch (InterruptedException ex) { } } }

[color=darkred]Por fim fazer o metodo sorteio [/color]
Método que seta a label, e será executado dentro da run

[code]public void sorteia() {
if (num < 101) {
num++;
}
if (num == 101) {
num = 0;
}
setText(Integer.toString(num));

}[/code]

Agora so fazer um frame e estanciar um objeto do tipo Sorteio tentro, para que nao Haja duvida vou colocar aqui em baixo um teste
Testa ele no metodo main

public static void main(String[] args) { JFrame janela = new JFrame(); janela.add(new Sorteio()); janela.setBounds(300,300,400, 200); janela.setDefaultCloseOperation(3); janela.setVisible(true); } }

david.jv- De uma estudada mais afundo, na parte de Thread, ajudaria muito você a entender estas coisas.[/quote]

dyeimys, muito legal o seu exemplo, deu certim para o meu problema.
Mas eu tentei fazer uma mudança nele e está dando erro. Segue o código abaixo:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sorteanumero;

import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;


    public class Sorteio extends JLabel implements Runnable {  
        int num;
        int result = 1;

            public Sorteio() {  
            
            setFont(new Font("", Font.BOLD, 100));  
            
            final Thread th = new Thread(this);  
            
            addMouseListener(new MouseListener() {  
            @Override
                public void mouseClicked(MouseEvent e) {  
    
                if(result==1){ // Aqui eu coloquei essa condição
                        th.stop();
                        result +=1;
                }else{
                    th.start();
                    result-=1;
                    }
                }  
            @Override
                public void mousePressed(MouseEvent e) {  
                }  
            @Override
                public void mouseReleased(MouseEvent e) {  
                }  
            @Override
                public void mouseEntered(MouseEvent e) {  
                }  
            @Override
                public void mouseExited(MouseEvent e) {  
                }  
            });  
             
            th.start();  
        }
            
    @Override
            public void run() {  
        for (;;) {  
            try {  
                sorteia();  
                Thread.sleep(30);  
            } catch (InterruptedException ex) {  
            }  
        }  
    }
    
    
    public void sorteia() {  
        if (num < 101) {  
            num++;  
        }  
        if (num == 101) {  
            num = 0;  
        }  
        setText(Integer.toString(num));  
  
    } 
    
    
 }

O que eu tentei mudar foi o seguinte. A primeira fez que a pessoa clicar ele para. se ela clicar de novo ele volta a sortear. Para isso
acrescentei uma condição, só que tá dando essa exceção:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:638)
at sorteatime2.Sorteio$1.mouseClicked(Sorteio.java:31)
at java.awt.Component.processMouseEvent(Component.java:6291)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Ai fica mais complicado, mais vou estudar e ja lhe mando pode esperar ae

Acho que este problema agora se torna Resolvido (se der certo, responde ae)

[code] public void mouseClicked(MouseEvent e) {

            if (result == 1) { // Aqui eu coloquei essa condição
                th.suspend();
                result += 1;
            } else {
                th.resume();
                result -= 1;
            }
        }[/code]

Voce ira trabalha com a parada dele diferente, ao invés de dar um [color=red]stop() [/color], voce ira suspender ele
na hora de retornar a tread voce da um resume().

Porque uma vez thread parada ja era… Finalizou

Já que estou de[size=18] ferias[/size] mesmo, resolvi brincar com a idéia, modifiquei o método sorteia(), um pouco mais
Agora ele vai até o MAX (Variavel interia de numero maximo do sorteio) em ordem Crescente e volta em ordem decrecente.

[code]
boolean maior= false;
boolean menor = true;
int MAX = 100; //Até quando voce quer sortear
public void sorteia() {

    /**
     * Verifica se o numero e maior ou menor que o maximo
     */
    if(num==MAX){
        maior = true;
        menor= false;
    }if(num==0){
        menor=true;
        maior = false;
    }
    /**
     * As condiçoes para maior e para menor
     */
    if (maior&&menor==false) {
        num--;
    }
    if (menor&&maior==false) {
        num++;
    }
    /**
     * setando o Label
     */
    setText(Integer.toString(num));

}[/code]

[size=18]Ps:[color=red] Se voce colocar na caneta voce consegue diminuir este codigo um pouco mais
[/color][/size]

uhhhh… certim cara. vlw mesmo