Random... sortear numero [resolvido]

9 respostas
D

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?

9 Respostas

ViniGodoy

Não tem jeito, só usando threads.

Veja se esse exemplo te ilumina:

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.
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();
    }
[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
public void sorteia() {
        if (num < 101) {
            num++;
        }
        if (num == 101) {
            num = 0;
        }
        setText(Integer.toString(num));

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

eduardoac

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

Veja se esse exemplo te ilumina:


Muito bom material!
:slight_smile:

snowblacksoul

dyeimys

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

D
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.
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();
    }
[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
public void sorteia() {
        if (num < 101) {
            num++;
        }
        if (num == 101) {
            num = 0;
        }
        setText(Integer.toString(num));

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

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)

dyeimys

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

dyeimys
Acho que este problema agora se torna Resolvido (se der certo, responde ae)
public void mouseClicked(MouseEvent e) {

                if (result == 1) { // Aqui eu coloquei essa condição
                    th.suspend();
                    result += 1;
                } else {
                    th.resume();
                    result -= 1;
                }
            }
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

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

    }

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

D

uhhhh… certim cara. vlw mesmo

Criado 29 de junho de 2011
Ultima resposta 30 de jun. de 2011
Respostas 9
Participantes 5