Help! Sorteio de números seqüênciais

8 respostas
E

Bom dia! Sou iniciante em java, baixei o netbeans 6 e estou tentando fazer um software que faça o sorteio de números seqüênciais. Por exemplo: Tenho 10 exercícios para serem sorteados entre os alunos, sendo que dois ou mais alunos poderão fazer o mesmo exercício. Quero um software que conte de 1 a 10 indefinidamente e, quando um aluno clicar no botão, o software vai mostrar exatamente o número que estava na variável no momento do clique.

Para isto, criei um formulário com:

  • Um jTextField onde vou entrar com a quantidade de exercícios existentes.
  • Um jLabel onde os números deveriam aparecer (como se fosse um mostrador).
  • E um jButton que serve para acionar e parar o contador.

No evento “jButton1ActionPerformed”, coloquei o seguinte código:

// Flag <- variável boolean da classe com valor inicial "false";
// Cont e C <- variáveis int da classe com valores iniciais "0" e "1" respectivamente;

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            Flag = !Flag;
    if (! jTextField1.getText().isEmpty()){
        while (Flag){
            C++;
            if (C > 32760)
            C = 1;
            Cont = C % Integer.valueOf(jTextField1.getText());
            jLabel2.setText(String.valueOf(Cont + 1));
        }
    }
}

Achei que daria certo mas, o software entra em lupe infinito (até aqui tudo bem, esta era a idéia). Mas, o mostrador (jLabel2) não está sendo atualizado e o botão (jButton1), uma vez apertado para iniciar o contador (passando o valor da variável Flag para “true”), não volta ao normal. Ou seja, ele fica sempre apertado, não volta para que eu possa aperta-lo novamente e passar o valor da variável Flag para “false”, com o intuito de parar o contador.

Se alguém puder me ajudar, ficarei muito agradecido!

8 Respostas

M

use a classe Random

thegoergen

Primeiramente leia o tutorialzinho aqui:
http://www.guj.com.br/posts/list/50115.java

E eu acho que você precisa dar um invalidate() no componente, para ele alterar o componente.

E

Bom dia Sr. MarceloLux!

Primeiramente, obrigado por responder a minha mensagem.
Contudo, meu problema não consiste em gerar os números aleatórios.

Os problemas que tenho são:

  • Fazer com que os números apareçam no formulário.
  • Ter como parar o contador após este ter sido iniciado.

Atenciosamente,

Edwar Saliba Jr.

D

Random random = new Random(); private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { Flag = !Flag; if (! jTextField1.getText().isEmpty()){ while (Flag){ C++; if (C > 32760) C = 1; Cont = C % Integer.valueOf(jTextField1.getText()); jLabel2.setText(random.nextInt(10)); Flag = !Flag; } } }

Primeiro de tudo, pra não dar o loop infinito vc tem que mudar o valor da flag, senão ela vai ser sempre true, e sempre vai entrar no while…
Para sortear um número, vc pode usar a classe Random. Como no exemplo, random.nextInt(10)
E mais uma… Procure usar as váriaveis com a primeira letra minúscula.

thegoergen

Talvez você possa usar Threads separadas. Uma para o laço, que ficará gerando números, e outra que rodará o programa normal, qua pegará o número atual no clique do botão.

E

Senhores(as), bom dia a todos e, desde já, obrigado por tentarem me ajudar!

Sr. thegoergen,

Primeiramente, obrigado pelo tutorial de como formatar o código do fórum, confesso que tentei por espaços no código fonte postado, de tudo quanto é jeito possível, mas não consegui. Esse tutorial foi muito bom. Valeu!

Quanto ao uso do “invalidate();” no componente, infelizmente não funcionou.

Agora, quanto ao uso de “threads” separadas, uma para cada função, talvez funcione mesmo. A idéia é boa! Contudo, ainda tenho que estudar muito até que consiga fazer uma thread! Mas valeu, creio que só assim o software vai funcionar com o mostrador. Obrigado!

Sr. danielhoppe

A idéia de utilizar a classe Random com limitador numérico é boa. Quanto ao lupe infinito, acho que isto só se resolverá da maneira proposta pelo sr. thegoergen, pois, através de threads é possível fazer o software contar e atualizar os componentes e ainda esperar uma entrada de dados, no caso, o clique do botão.
A propósito, vou começar a escrever as variáveis com iniciais em minúsculo. Obrigado!

Att,

Edwar Saliba Jr.

thegoergen

Olha um exemplinho com Threads…

/*
 * Sorteio.java
 *
 * Created on 11 de Abril de 2008, 12:26
 */

import javax.swing.JOptionPane;

/**
 *
 * @author  Diego
 */
public class Sorteio extends javax.swing.JFrame {
      
      
      /** Creates new form Sorteio */
      public Sorteio() {
	    initComponents();
	    iniciaLoop();
      }
      
      private void iniciaLoop(){
	    new Thread() { // Crio uma nova Thread
		  public void run() { // Esse método e o padrão das Threads, indica o que será excutado
			while(true){ // Crio um loop infinito
			      label.setText("" + new Double(Math.random()*10).intValue() ); // Aqui eu seto um número aleatório de 0 a 9, para o seu caso você precisa ver outra alternativa, parece que tem um limite.. Mas isso é lógica tua.
			}
		  }
	    }.start();
	    
      }
      
      private void initComponents() {
            java.awt.GridBagConstraints gridBagConstraints;

            private javax.swing.JButton botao = new javax.swing.JButton();
            private javax.swing.JLabel label = new javax.swing.JLabel();

            getContentPane().setLayout(new java.awt.GridBagLayout());

            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            botao.setText("Parar");
            botao.addActionListener(new java.awt.event.ActionListener() {
                  public void actionPerformed(java.awt.event.ActionEvent evt) {
                        botaoActionPerformed(evt);
                  }
            });

            gridBagConstraints = new java.awt.GridBagConstraints();
            gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
            gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
            getContentPane().add(botao, gridBagConstraints);

            gridBagConstraints = new java.awt.GridBagConstraints();
            gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
            gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
            getContentPane().add(label, gridBagConstraints);

            pack();
      }              
      
      private void botaoActionPerformed(java.awt.event.ActionEvent evt) {                                      
	    JOptionPane.showMessageDialog(this, "O número atual é " + label.getText()); // No evento do botão eu só mostro o número atual, não sei o que você deseja fazer...
      }                                     
      
      /**
       * @param args the command line arguments
       */
      public static void main(String args[]) {
	    java.awt.EventQueue.invokeLater(new Runnable() {
		  public void run() {
			new Sorteio().setVisible(true);
		  }
	    });
      }
      
}
E

Bom dia Sr. thegoergen!

Primeiramente quero agradecer pelo código que o senhor postou no fórum com um exemplo de Thread.
Com certeza ajudará bastante, não só no desenvolvimento deste software, como também no meu entendimento a respeito do assunto.

Vou tentar transcrever este código para o software que estou desenvolvendo. Só vi o e-mail do fórum hoje.

Mais uma vez muito obrigado por todo o auxílio que o senhor me deu.

Att,

Edwar Saliba Jr.

Criado 11 de abril de 2008
Ultima resposta 14 de abr. de 2008
Respostas 8
Participantes 4