Sorteios aleatorios sem repetiçao

26 respostas
Q

oi galera, to aki novamente precisando da ajuda de vcs!
é o seguinte: este codigo sorteia numeros aleatorios em uma lista.

public List sorteia1( int quantidadeDeElementosASortear, int limiteInferior, int limiteSuperior){
            int quantidadeDeVezes=0;
            List<Integer> elementos = new ArrayList<Integer>(limiteSuperior - limiteInferior + 1);

            for (int i = limiteInferior; i <= limiteSuperior; i++){
                elementos.add(Integer.valueOf(i));
            }
            Collections.shuffle(elementos);
            List<Integer> resultado = elementos.subList(0,quantidadeDeElementosASortear);
            Collections coll = null;
            coll.sort(resultado);
            List armazenamentoDeValores=null;
            armazenamentoDeValores=resultado;
            System.out.println(resultado);
            return new ArrayList(resultado);
        }
o problema é que nao consigo fazer com que ele sorteie numeros q nunca irao se repetir.

vcs têm alguma idéia?

26 Respostas

E

O método Math.random ou o método nextInt() da classe java.util.Random têm exatamente o mesmo comportamento de um dado - se você lançar um dado muitas vezes, pode ser que os números se repitam. Um processo aleatório “de verdade” não tem memória e portanto pode acabar mostrando um valor repetido.

Uma forma de você sortear números aleatórios sem repetição é você acrescentar os números já sorteados a uma lista. Quando você for sortear o próximo número, veja se está nessa lista primeiro. Se não estiver, então esse é um número que ainda não foi sorteado, e pode ser adicionado a essa lista. Se estiver nessa lista, vá sorteando outros números, até achar um que não esteja nessa lista.

OK?

A

Só uma observação: no seu método sorteia1, já são sorteados números que não se repetem.

Você quer que os números não se repitam entre várias chamadas do método sorteia1?

V

Seu método está desnecessariamente complexo.

public SortedSet&lt;Integer&gt; sorteia(int quantidadeDeElementosASortear, int limiteInferior, int limiteSuperior){
   List&lt;Integer&gt; numeros = new ArrayList&lt;Integer&gt;();
   for (int i = limiteInferior; i &lt; limiteSuperior; i++) {
      numeros.add(i);
   }

   Collections.shuffle(numeros);
   return new TreeSet&lt;Integer&gt;(numeros.subList(0, quantidadeDeElementosASortear));
}
Q

cara o que é esse “range”?

for (int i = limiteInferior; i < range; limiteSuperior++)
V

Foi mal, já corrigi ali em cima.

Q

valew cara

A

O método do ViniGodoy faz a mesma coisa que o seu fazia (de forma bem mais simples e direta).

Qual era sua dúvida afinal?

A

cara seu codigo esta muito complexo mesmo, muuuito complexo mesmo…

basta fazer o seguinte:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class NumerosAleatorios extends JFrame implements ActionListener{
	JTextField campoNumero = new JTextField();
	JButton btnGerar = new JButton("Gerar matrícula");
	JButton btnLimpar = new JButton("Limpar");
	int i;
	   
	public NumerosAleatorios(){
		super("Sorteio de numeros aleatorios");
		setSize(450,450);
		
		JPanel principal = new JPanel();
		principal.setLayout(null);
	
		Random of = new Random();
		int jf = 900000;
		i = of.nextInt(jf);
		
		campoNumero.setBounds(200,100,110,30);
		principal.add(campoNumero);
		
		btnGerar.setBounds(100,220,130,30);
		principal.add(btnGerar);
		
		btnLimpar.setBounds(240,220,130,30);
		principal.add(btnLimpar);
		
		btnGerar.addActionListener(this);
		btnLimpar.addActionListener(this);
		
		add(principal);
		setVisible(true);
		}
	public static void main(String[] args) {
		NumerosAleatorios o = new NumerosAleatorios();
	}
	public void actionPerformed(ActionEvent arg0) {
		Object evt = arg0.getSource();
		
		if (evt == btnGerar){
			setVisible(false);
			NumerosAleatorios p = new NumerosAleatorios();
			p.campoNumero.setText(""+i);
		}
		if (evt == btnLimpar){
			campoNumero.setText("");
		}
		
	}
}

mais ate ai, eu so te ajudei a fazer um campo que gere uma matricula ou uma senha ou alguma coisa do tipo, so que bem mais fácil do que o seu.
mais…
feito isso… vou te dar a dica, (esperiência propria)eu sei fazer mais posta o código tbm ja é muito doce, mais vc cria uma tabela em um BD so pra armazenar as matriculas geradas, cria um método que faz uma consulta nessa tabela e faz a verificação, se a matricula que o SELECT trouxe for igual ao que foi gerada, emiti uma mensagem de erro na tela (JOptionPane.showMessageDialog(null,“Matricula já cadastrada, clique para gerar outra!”).

e DETALHE, esse codigo que eu postei para gerar uma matricula, eu usei o MÉTODO NextInt(int N); que funciona da seguinte forma, no lugar do N vc coloca um inteiro com um número por exemplo 50. ai ele so gera numeros entre 50. mais voce pode optar por nao colocar, daí ele pode gerar um inteiro de [telefone removido] desse tamanho mesmo, e detalhe, ele pode sair com vírgula…rsrsrs

ta aí a dica…

espero ter ajudado… vlwsss

V

Só algumas observações quanto ao exemplo e os comentários acima:

  1. Não se passa null no primeiro parâmetro do JOptionPane, e sim, a janela que abriu o JOptionPane (geralmente this, ou NomeDaClasseDaJanela.this). Caso contrário, você terá problemas com ALT+TAB na sua aplicação.
  2. Não se usa setBounds. Apesar de no exemplo ficar simples, é só um exemplo. Na prática, use gerenciadores de layout. Ou sua aplicação não será portável (pode dar problema mesmo entre diferentes versões de um mesmo SO), e não será fácil redimensionar a tela;
  3. Você não deve dar setVisible(true) no construtor das janelas. É considerado uma má prática (quem deve decidir se a janela fica visível ou não é quem deu “new” nela, não a própria janela);
  4. Não se deve implementar um único actionListener para todos os botões. Isso gera um código de baixa performance, difícil manutenção e pouco orientado à objetos. Note que switchs ou ifs encadeados são considerados um mau cheiro de código. O ideal é registrar um listener por botão;
  5. Lembre-se de declarar seus atributos como private;
  6. Lembre-se que você deve criar e tornar a janela visível na thread do Swing, não na main Thread. Por isso, é aconselhável usar o comando EventQueue.invokeLater.

Siga essas dicas se não quiser evitar dores de cabeça fortes no futuro.

A

PARA - ViniGodoy

cara… então posta um exemplo de uma chamada da setVisible(true) pelo método main ai pra min… e fale tbm sobre os action listener…

explica melhor ai e me de um exemplo, se puder…

pq eu sou novo em java, e gostaria de saber mais enquanto a esses pequenos detalhes de programação. para ela ficar uma programação PADRÃO…

e nao uma programação estruturada…

mais eu ja fiz uns programas ai complexos, fiz um até baseado no BRB, pq eu trabalho lah… ai eu fiz um sistema, que cadastra funcionários, altera, excluir, lista em uma tabela, tem buscas avançadas por nome, por setor que o funcionario trabalha, por empresa, se ele for terceirizado, adiciona um almento para ele, o sistema tem ate LOGIN e SENHA.

é uma aplicação que está baseada em + ou - 35 classes, desde a tela principal, a uma classe so para a conexao com o BD, uma classe so com os métodos de alteração, exclusão, e demais, uma classe (encapsulada) com as variávei privates.

ai eu queria que voce me falasse (SE VC PUDER E CLARO), o que é padrão ou não, pq pretende tirar certificação J2EE um dia…

portanto irei postar so uma classe para voce analizar… esta é a classe que tem a tabela de funcionários…

package Informacoes.br.com.apresentacao;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import Informacoes.br.com.dao.Conexao;
import Informacoes.br.com.dao.FuncionarioDAO;
import Informacoes.br.com.modelo.FuncionarioGET;

import com.mysql.jdbc.Statement;

@SuppressWarnings("serial")
public class TabelaFuncionarios extends JFrame implements ActionListener{
	
	 String []empresas = {};
	 String []nucleos = {};
	 JButton btnInicio = new JButton("inicio");
	 JButton btnPesquisarPorNome = new JButton("Pesquisar");
	 JButton btnAlterar = new JButton("Alterar");
	 JButton btnListarTodos = new JButton("Listar todos");
	 JButton btnSair = new JButton ("Sair");
	 JButton btnLimpar = new JButton("Limpar Tabela");
	 JButton btnAumento = new JButton ("Add Aumento");
	 JButton btnNucleos = new JButton ("Tabela Nucleos");
	 JButton btnExcluir = new JButton("Excluir");
     JButton btnCadastrar = new JButton("Cadastrar novo");
     JButton btnPesquisarPorEmpresa = new JButton("Pesquisar");
     JButton btnPesquisarPorNucleo = new JButton("Pesquisar");
     DefaultTableModel modelo  = new DefaultTableModel();
     JTable tabela1 = new JTable (modelo);
     JScrollPane Scroll = new JScrollPane();
     JTextField campoConsultaPorNome = new JTextField();
     JComboBox campoComboConsultaPorEmpresa = null;
     JComboBox campoComboPesquisaPorNucleos = null;
     FuncionarioGET jk = new FuncionarioGET();
    
     public TabelaFuncionarios(){
           
		    super ("Tabela de Funcionários");
		    setSize(1010,730);
		    setDefaultCloseOperation(EXIT_ON_CLOSE);
		    setUndecorated(true);
		    setResizable(false);
		    setDefaultLookAndFeelDecorated(true);
		    getRootPane().setWindowDecorationStyle(JRootPane.ERROR_DIALOG);
		    
			JPanel principal = new JPanel();
			principal.setLayout(new FlowLayout(1,1,1));
			principal.setBackground(Color.black);
	
			JPanel consulta = new JPanel();
			consulta.setLayout(null);
			
			JLabel labelConsultaPorNome = new JLabel("Consultar funcionario:");
			labelConsultaPorNome.setBounds(10,10,130,30);
			consulta.add(labelConsultaPorNome);
			
			JLabel labelConsultaPorEmpresa = new JLabel("Consultar funcionario por empresa:");
			labelConsultaPorEmpresa.setBounds(320,10,220,30);
			consulta.add(labelConsultaPorEmpresa);
			
			JLabel labelConsultaPorNucleo = new JLabel("Consultar funcionario por Nucleo:");
			labelConsultaPorNucleo.setBounds(620,10,220,30);
			consulta.add(labelConsultaPorNucleo);
			
			empresas = metodoEmpresas();
			campoComboConsultaPorEmpresa = new JComboBox(empresas);
			campoComboConsultaPorEmpresa.setBounds(320,40,160,25);
			consulta.add(campoComboConsultaPorEmpresa);
			
			nucleos = consulta();
			campoComboPesquisaPorNucleos = new JComboBox(nucleos);
			campoComboPesquisaPorNucleos.setBounds(620,40,120,25);
			consulta.add(campoComboPesquisaPorNucleos);
			
			campoConsultaPorNome.setBounds(10,40,160,25);
			consulta.add(campoConsultaPorNome);
			
			btnPesquisarPorNome.setBounds(173,40,95,25);
			consulta.add(btnPesquisarPorNome);

			btnPesquisarPorNucleo.setBounds(745,40,95,25);
			consulta.add(btnPesquisarPorNucleo);
			
			btnListarTodos.setBounds(855,40,115,25);
			consulta.add(btnListarTodos);
			
			btnPesquisarPorEmpresa.setBounds(483,40,95,25);
			consulta.add(btnPesquisarPorEmpresa);
			
			modelo.addColumn("Id");
			modelo.addColumn("Nome");
			modelo.addColumn("Cpf");
			modelo.addColumn("Rg");
			modelo.addColumn("Email");
			modelo.addColumn("Sexo");
			modelo.addColumn("Empresa");
			modelo.addColumn("Núcleo");
			modelo.addColumn("Cargo");
			modelo.addColumn("Est. Civil");
			modelo.addColumn("Salário");
			modelo.addColumn("Estado");
			modelo.addColumn("Endereço");
			modelo.addColumn("Idade");
	
			tabela1.getColumnModel().getColumn(0).setPreferredWidth(0);
			tabela1.getColumnModel().getColumn(13).setPreferredWidth(5);
			tabela1.setFont(new Font("segoe ui",Font.PLAIN,(13)));
			tabela1.setSelectionBackground(Color.YELLOW);
			tabela1.setSelectionForeground(Color.black);
			Scroll.setViewportView(tabela1);
            
			principal.add(btnCadastrar);
			principal.add(btnAlterar);
			principal.add(btnExcluir);
			principal.add(btnInicio);			
			principal.add(btnAumento);
			principal.add(btnLimpar);
			principal.add(btnNucleos);
			
			btnSair.setForeground(Color.white);
			btnSair.setBackground(Color.red);
			principal.add(btnSair);
			
			Scroll.setBounds(5,95,980,530);
			principal.setBounds(90,638,750,30);
			
			btnInicio.addActionListener(this);
			btnSair.addActionListener(this);
			btnAlterar.addActionListener(this);
			btnExcluir.addActionListener(this);
			btnListarTodos.addActionListener(this);
			btnCadastrar.addActionListener(this);
			btnLimpar.addActionListener(this);
			btnInicio.addActionListener(this);
			btnPesquisarPorNome.addActionListener(this);
			btnPesquisarPorEmpresa.addActionListener(this);
			btnAumento.addActionListener(this);
			campoConsultaPorNome.addActionListener(this);
			btnNucleos.addActionListener(this);
			btnPesquisarPorNucleo.addActionListener(this);
			
			add(Scroll);
			add(principal);
			add(consulta);
			
		    setVisible(true);
	 }
	private String[] metodoEmpresas() {
		
		String[] aux = null;
		Conexao coc = new Conexao();
		Statement st = null;
		ArrayList &lt;String&gt; lista = new ArrayList&lt;String&gt;();
		
		try {
			st = (Statement) coc.conectar().createStatement();
		} catch (SQLException e1) {
			JOptionPane.showConfirmDialog(null, "não foi possivel fazer a conexao");
			e1.printStackTrace();
		} catch (ClassNotFoundException e1) {
			JOptionPane.showConfirmDialog(null, "classe nao encontrada");
			e1.printStackTrace();
		}
		
        String sql = "select SiglaEmpresa from Empresas";
		ResultSet rs = null;
		try {
			rs = (ResultSet) st.executeQuery(sql);
			while (rs.next()){
				lista.add(rs.getString("SiglaEmpresa"));
			}
			
			aux = new String[lista.size()];
			
			for (int i=0; i&lt;lista.size(); i++){
					aux[i]=lista.get(i);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}	

		return aux;
	}
	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		TabelaFuncionarios ok = new TabelaFuncionarios();
		ok.listarTodos();
	}
	
private  String[] consulta() {
		
		String[] aux = null;
		Conexao coc = new Conexao();
		Statement st = null;
		ArrayList &gt;&lt;String&gt; lista = new ArrayList&lt;String&gt;();
		
		try {
			st = (Statement) coc.conectar().createStatement();
		} catch (SQLException e1) {
			JOptionPane.showConfirmDialog(null, "não foi possivel fazer a conexao");
			e1.printStackTrace();
		} catch (ClassNotFoundException e1) {
			JOptionPane.showConfirmDialog(null, "classe nao encontrada");
			e1.printStackTrace();
		}
		
        String sql = "select SiglaNucleo from nucleos";
		ResultSet rs = null;
		try {
			rs = (ResultSet) st.executeQuery(sql);
			while (rs.next()){
				lista.add(rs.getString("SiglaNucleo"));
			}
			
			aux = new String[lista.size()];
			
			for (int i=0; i&lt;lista.size(); i++){
					aux[i]=lista.get(i);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}	

		return aux;
	}
	
	public void listarTodos(){
		FuncionarioDAO operac = new FuncionarioDAO();
		ArrayList&gt;&lt;FuncionarioGET&gt; lista = operac.consultarTodos();
		
		Object []vec=null; 
		vec = new Object[14];

		for (int i=0; i&lt;lista.size(); i++){ 
			  vec[0]  = ((lista.get(i).getId()));
			  vec[1]  = ((lista.get(i).getNome()));
			  vec[2]  = ((lista.get(i).getCpf()));
			  vec[3]  = ((lista.get(i).getRg()));
			  vec[4]  = ((lista.get(i).getEmail()));
			  vec[5]  = ((lista.get(i).getSexo()));
			  vec[6]  = ((lista.get(i).getEmpresa()));
			  vec[7]  = ((lista.get(i).getSetor()));
			  vec[8]  = ((lista.get(i).getCargo()));
			  vec[9]  = ((lista.get(i).getEstadoCivil()));
			  vec[10] = ((lista.get(i).getSalario()));
			  vec[11] = ((lista.get(i).getLocalizacao()));
			  vec[12] = ((lista.get(i).getEndereco()));
			  vec[13] = ((lista.get(i).getIdade()));	
			  modelo.addRow(vec);
		}
	}
	public void listarPesquisa(){
		FuncionarioDAO operac = new FuncionarioDAO();
		ArrayList&gt;&lt;FuncionarioGET&gt; lista = operac.consultar1(jk);
		Object []vec=null; 
		vec = new Object[14];

		for (int i=0; i&lt;lista.size(); i++){ 
			  vec[0]  = String.valueOf((lista.get(i).getId()));
			  vec[1]  = ((lista.get(i).getNome()));
			  vec[2]  = ((lista.get(i).getCpf()));
			  vec[3]  = ((lista.get(i).getRg()));
			  vec[4]  = ((lista.get(i).getEmail()));
			  vec[5]  = ((lista.get(i).getSexo()));
			  vec[6]  = ((lista.get(i).getEmpresa()));
			  vec[7]  = ((lista.get(i).getSetor()));
			  vec[8]  = ((lista.get(i).getCargo()));
			  vec[9]  = ((lista.get(i).getEstadoCivil()));
			  vec[10] = ((lista.get(i).getSalario()));
			  vec[11] = ((lista.get(i).getLocalizacao()));
			  vec[12] = ((lista.get(i).getEndereco()));
			  vec[13] = ((lista.get(i).getIdade()));	
			  modelo.addRow(vec);
		}
	}
	public void actionPerformed(ActionEvent e) {
		Object c = e.getSource();
		
		if (c == btnListarTodos){
			modelo.setNumRows(0);
			this.listarTodos();
		}
		if (c == btnNucleos){
			setVisible(false);
			TabelaDeNucleos ol = new TabelaDeNucleos();
			ol.listarTodos();
		}
		if (c == (btnPesquisarPorNome)){
			
			jk.setConsulta(campoConsultaPorNome.getText());
	
			if (jk.getConsulta().equals("")){
				JOptionPane.showMessageDialog(null,"Digite pelo menos a primeira letra do nome desejado/n ou clique em listar todos.");				
			}
			else{
				modelo.setNumRows(0);
				this.listarPesquisa();
			}
		}
		if (c == (btnCadastrar)){
			setVisible(false);
			new CadastroFuncionario();
		}
		if (c == (btnLimpar)){
			modelo.setNumRows(0);
		}	
		if (c == (btnSair)){
			int j = JOptionPane.showConfirmDialog(null, "Sair da aplicação?");
				if (j == 0){
					System.exit(DISPOSE_ON_CLOSE);
				}
		}	
		if (c == btnInicio){
			setVisible(false);
			new TelaPrincipal();
		}	
		if (c == btnAlterar){
			try {
				jk.setNome((String)tabela1.getValueAt(tabela1.getSelectedRow(),1));
				jk.setCpf((String)tabela1.getValueAt(tabela1.getSelectedRow(),2));
				jk.setRg((String)tabela1.getValueAt(tabela1.getSelectedRow(),3));
				jk.setEmpresa((String)tabela1.getValueAt(tabela1.getSelectedRow(),6));
				jk.setCargo((String)tabela1.getValueAt(tabela1.getSelectedRow(),8));
				jk.setSetor((String)tabela1.getValueAt(tabela1.getSelectedRow(),7));
				jk.setEstadoCivil((String)tabela1.getValueAt(tabela1.getSelectedRow(),9));
				jk.setSalario((String)tabela1.getValueAt(tabela1.getSelectedRow(),10));
				jk.setEmail((String)tabela1.getValueAt(tabela1.getSelectedRow(),4));
				jk.setEndereco((String)tabela1.getValueAt(tabela1.getSelectedRow(),12));
				jk.setIdade((String)tabela1.getValueAt(tabela1.getSelectedRow(),13));
				jk.setLocalizacao((String)tabela1.getValueAt(tabela1.getSelectedRow(),11));
				jk.setSexo((String)tabela1.getValueAt(tabela1.getSelectedRow(),5));
				jk.setId((String)tabela1.getValueAt(tabela1.getSelectedRow(),0));
				new Alterarfuncionarios(jk);
			} catch (ArrayIndexOutOfBoundsException e1) {
				JOptionPane.showMessageDialog(null, "Selecione um funcionario para ALTERAÇÃO");
				TabelaFuncionarios ok = new TabelaFuncionarios();
				ok.listarTodos();
			}	
		}
		if (c == btnExcluir){
			try {
				jk.setNome((String)tabela1.getValueAt(tabela1.getSelectedRow(),1));
				FuncionarioDAO op = new FuncionarioDAO();
				op.excluir(jk);
				setVisible(false);
			} catch (ArrayIndexOutOfBoundsException e1) {
				JOptionPane.showMessageDialog(null, "Selecione um funcionario para EXCLUSÃO");	
			}
		}
		if (c == btnAumento){
				try {
					jk.setNome(String.valueOf((String)tabela1.getValueAt(tabela1.getSelectedRow(),1)));
					jk.setId(((String) tabela1.getValueAt(tabela1.getSelectedRow(),0)));
					jk.setSalario((String)(tabela1.getValueAt(tabela1.getSelectedRow(),10)));
					new Aumento(jk);
					setVisible(false);
				} catch (ArrayIndexOutOfBoundsException e1) {
					JOptionPane.showMessageDialog(null, "Selecione um funcionario para adicionar um AUMENTO");	
			}
		}
		if (c == btnPesquisarPorEmpresa){
			jk.setConsulta2((String)campoComboConsultaPorEmpresa.getSelectedItem());
			setVisible(false);
			TabelaStatusFuncionario ok = new TabelaStatusFuncionario();
			ok.pesquisarPorStatus(jk);
		}
		if (c == btnPesquisarPorNucleo){
			jk.setConsulta2((String)campoComboPesquisaPorNucleos.getSelectedItem());
			setVisible(false);
			TabelaStatusFuncionario ok1 = new TabelaStatusFuncionario();
			ok1.pesquisarPorNucleo(jk);
		}
    }
  }

vlws…>

V

Essa classe tem todos os problemas que citei anteriormente, ainda mais alguns:

  1. Usa DefaultTableModel (minha assinatura não tem aquelas frases vermelhas por acaso);
  2. Você fez o import em com.mysql.jdbc.Statement, quando deveria ser java.sql.Statement (se fizer o import certo, vai evitar diversos casts no seu código);
  3. Contém os métodos para manipular dados. Esses métodos deviam estar em outra classe (FuncionarioDAO).
  4. Você não fecha a conexão, resultset e statement num finally.
  5. Você não usa as listas através da interface List (que é recomendado). Declare o arrayList assim:
List&lt;Funcionario&gt; funcionarios = new ArrayList&lt;Funcionario&gt;();

Ao invés de:

ArrayList&lt;Funcionario&gt; funcionarios = new ArrayList&lt;Funcionario&gt;();

Você precisa estudar:

  1. Como fazer seu próprio TableModel (diversos links para isso na minha assinatura);
  2. O padrão MVC (vai ser útil para web também);
  3. Layout managers (veja material aqui, aqui e aqui).
  4. Como tratar exceções corretamente (veja material aqui, aqui, aqui, aqui e aqui).
V
Aqui vai um exemplo de programa comentado com uma série de boas práticas:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

//Evite implementar interfaces como "ActionListener" ou "WindowListener" no JFrame.
//Isso viola o encapsulamento. Aliás, jamais implemente uma interface publicamente
//caso seus métodos não possam ser chamados diretamente.

//Note que se vc implementar actionListener num JFrame, nada impede seu usuário de fazer:
//NumerosAleatorios na = new NumerosAleatorios();
//JButton botao = new JButton();
//botao.addActionListener(na); //Provavelmente um POG.

public class NumerosAleatorios extends JFrame {
	private Random random = new Random();
	private JLabel lblCampoNumero = new JLabel("Numero:");
	private JTextField txtCampoNumero = new JTextField();
	private JButton btnGerar = new JButton("Gerar matrícula");
	private JButton btnLimpar = new JButton("Limpar");	

	public NumerosAleatorios(){
		super("Sorteio de numeros aleatorios");
		setSize(300,100);
		setLocationRelativeTo(null); //Centraliza o JFrame na tela
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Criamos um painel para a questão
		JPanel pnlQuestao = new JPanel(new BorderLayout());
		pnlQuestao.add(lblCampoNumero, BorderLayout.WEST);
		pnlQuestao.add(txtCampoNumero, BorderLayout.CENTER);
		
		//Criamos um painel para os botões
		JPanel pnlBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pnlBotoes.add(btnLimpar);
		pnlBotoes.add(btnGerar);
		
		//Criamos o painel que contém os dois paineis
		JPanel pnlPrincipal = new JPanel(new BorderLayout());
		pnlPrincipal.add(pnlQuestao, BorderLayout.NORTH);
		pnlPrincipal.add(pnlBotoes, BorderLayout.SOUTH);
		
		//Adicionamos o listener aos botões.
		//Note que existe um listener por botão e nada de ifs.
		btnLimpar.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				txtCampoNumero.setText("");				
			}
		});
		
		btnGerar.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int numero = random.nextInt(Integer.parseInt(txtCampoNumero.getText()));
				
				//Note que o primeiro parâmetro é a própria janela. 
				//Ela é a dona desse OptionPane.
				JOptionPane.showMessageDialog(NumerosAleatorios.this, "O número gerado foi: " + numero);				
			}
		});
		
		add(pnlPrincipal);
	}
	public static void main(String[] args) {
		//O comando EventQueue.invokeLater vai disparar o código dentro do run() na 
		//Thread do Swing. Esse código roda na main Thread. 
		//Você jamais deve atualizar a tela fora da thread do Swing.
		EventQueue.invokeLater(new Runnable()
		{
			@Override
			public void run() {
				NumerosAleatorios o = new NumerosAleatorios();
				o.setVisible(true); //Note que é aqui que dou o setVisible(true).
			}
		});
	}
}
J
Eu fiz esse "programinha" para gerar numeros para a MEGASENA e funciona do jeito que o topico precisa.
int quantosJogos = 15;
        int quantosNumerosEmCadaJogo = 6;
        List<List> jogos = new ArrayList<List>();
        for (int i = 0; i < quantosJogos; i++) {
            List<Integer> jogo = new ArrayList<Integer>();
            for (int j = 0; j < quantosNumerosEmCadaJogo; j++) {
                Random generator = new Random();
                int numero = generator.nextInt(60) + 1; // cada numero esta entre 1 e 60
                if (jogo.contains(numero)) {
                    System.out.println("O numero " + numero + " esta repetido, nao adiciona");
                    j--;
                    continue;
                }
                jogo.add(numero);
            }
            Collections.sort(jogo);
            jogos.add(jogo);
        } // fim dos jogos

        //==========================================
        for (int i = 0; i < jogos.size(); i++) {
            List<Integer> jogo = jogos.get(i);
            for (int j = 0; j < jogo.size(); j++) {
                int numero = jogo.get(j);
                System.out.print("  " + numero);
            }
            System.out.println("");
        }
T
javer:
Eu fiz esse "programinha" para gerar numeros para a MEGASENA e funciona do jeito que o topico precisa.
int quantosJogos = 15;
        int quantosNumerosEmCadaJogo = 6;
        List<List> jogos = new ArrayList<List>();
        for (int i = 0; i < quantosJogos; i++) {
            List<Integer> jogo = new ArrayList<Integer>();
            for (int j = 0; j < quantosNumerosEmCadaJogo; j++) {
                Random generator = new Random();
                int numero = generator.nextInt(60) + 1; // cada numero esta entre 1 e 60
                if (jogo.contains(numero)) {
                    System.out.println("O numero " + numero + " esta repetido, nao adiciona");
                    j--;
                    continue;
                }
                jogo.add(numero);
            }
            Collections.sort(jogo);
            jogos.add(jogo);
        } // fim dos jogos

        //==========================================
        for (int i = 0; i < jogos.size(); i++) {
            List<Integer> jogo = jogos.get(i);
            for (int j = 0; j < jogo.size(); j++) {
                int numero = jogo.get(j);
                System.out.print("  " + numero);
            }
            System.out.println("");
        }

Eu odiaria dar manutenção em códigos com esse flavor ai.
Aliás, odeio, estou mexendo num projeto nesse nype.

J
Tchello:
javer:
Eu fiz esse "programinha" para gerar numeros para a MEGASENA e funciona do jeito que o topico precisa.
int quantosJogos = 15;
        int quantosNumerosEmCadaJogo = 6;
        List<List> jogos = new ArrayList<List>();
        for (int i = 0; i < quantosJogos; i++) {
            List<Integer> jogo = new ArrayList<Integer>();
            for (int j = 0; j < quantosNumerosEmCadaJogo; j++) {
                Random generator = new Random();
                int numero = generator.nextInt(60) + 1; // cada numero esta entre 1 e 60
                if (jogo.contains(numero)) {
                    System.out.println("O numero " + numero + " esta repetido, nao adiciona");
                    j--;
                    continue;
                }
                jogo.add(numero);
            }
            Collections.sort(jogo);
            jogos.add(jogo);
        } // fim dos jogos

        //==========================================
        for (int i = 0; i < jogos.size(); i++) {
            List<Integer> jogo = jogos.get(i);
            for (int j = 0; j < jogo.size(); j++) {
                int numero = jogo.get(j);
                System.out.print("  " + numero);
            }
            System.out.println("");
        }

Eu odiaria dar manutenção em códigos com esse flavor ai.
Aliás, odeio, estou mexendo num projeto nesse nype.


Bom "meu caro", eu não te pedi para dar manutenção nesse código, eu apenas disse que esse código com esse flavor aí faz o que foi pedido inicialmente no post, aliás eu fiz esse código PARA MIM MESMO e mandei apenas como um exemplo, que tal você ajudar ao invés de querer "mostrar" que o meu código está está com o tal nype?

V

Como assim, “o único”? O código que postei na terceira resposta é o que?
Aliás, o próprio autor já postou um código que gerava o que ele pediu, e por isso a estranheza seguinte…

Além disso, o seu código está extremamente mal escrito. Eu também detestaria mante-lo.

Aliás, ele nem fala em mega-sena. O autor propõe uma função em que ele mesmo especifique os limites inferior e superior.

T

É a mesma história da crítica do código que abriu esse tópico: está demasiadamente complexo.

Além de não ser um bom exemplo de performance e boa utilização da API básica.

Posso concordar que eu possa ter me excedido na crítica (na forma de me expressar, não no conteúdo), mas se você posta algo num forum público esteja ciente de que pode receber críticas de qualquer natureza.

V
O mesmo código do javer sem tanta complicação e possivelmente muitíssimo mais eficiente:
Random generator = new Random();
int quantosJogos = 15;
final int NUMEROS_POR_JOGO = 6;

List&lt;Set&lt;Integer&gt;&gt; jogos = new ArrayList&lt;Set&lt;Integer&gt;&gt;();
for (int i = 0; i &lt; quantosJogos; i++) {
    Set&lt;Integer&gt; jogo = new TreeSet&lt;Integer&gt;();
    while (jogo.size() &lt; NUMEROS_POR_JOGO) {
        jogo.add(generator.nextInt(60) + 1);
    }            
    jogos.add(jogo);
} 

//==========================================
for (Set&lt;Integer&gt; jogo : jogos) {
    for (Integer numero : jogo) {
        System.out.printf(" %02d", numero);
    }
    System.out.println();
}
J

A crítica é sempre bem vinda, contanto que seja construtiva (estou ciente que o forum é público e que posso receber criticas), eu no caso demonstraria exatamente no que o código está tão mal escrito, assim seria um risco a menos de “alguém” ter que dar manutenção em código ruim algum dia.

Agradeço pelas críticas, aprendi bastante, afinal de contas, vivendo e aprendendo.

A

viniGodoy

ta, blz cara… mais por que eu eu devo trabalhar com THEADS, pq preciso usar no metodo main, so pra chamar a janela, sendo que do jeito que eu estava fazendo era mais prático, ta certo que se do jeito que voce me falou, for o certo, eu vou demorar um tempo pra atualizar todos os meus programas do jeito certo, e no caso do action listener, valew… me tirou umas linhas de codigos imensas do meu programa, so que depois fica mais dificil de se entender… dificil de se procurar algum defeito que possa estar vindo de algum programa, ANALISE este outro codigo ai se puder…

package Informacoes.br.com.apresentacao;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRootPane;

@SuppressWarnings("serial")
public class TelaPrincipal extends JFrame implements ActionListener {
	
	
	JButton btnCadastrarProduto = new JButton("Cadastrar novos produtos");
	JButton btnCadastrar = new JButton("Cadastrar novos funcionarios");
	JButton btnConsultarFuncionario = new JButton("Consultar funcionario");
	JButton btnConsultarProduto = new JButton("Consultar Produto");
	JButton btnConsultarNucleo = new JButton("Consultar Núcleo");
	JButton btnCadastrarNucleo = new JButton("Cadastrar Núcleos");
	JButton btnCadastrarEmpresa = new JButton("Cadastrar Empresa");
	JButton btnConsultarEmpresa = new JButton("Consultar Empresa");
	JButton btnConsultarProfissao = new JButton("Consultar Profissao");
	JButton btnCadastrarProfissao = new JButton("Cadastrar Profissao");
	JButton btnSair = new JButton("Fechar");
	
	public TelaPrincipal(){
		
		super("Tela de Boas-Vindas!!");
   		setSize(650,650);
   		setResizable(false);
   		setUndecorated(true);
   		setDefaultCloseOperation(EXIT_ON_CLOSE);
   		setDefaultLookAndFeelDecorated(isDefaultLookAndFeelDecorated());
		getRootPane().setWindowDecorationStyle(JRootPane.WARNING_DIALOG);
		
		JDesktopPane fundo = new JDesktopPane();
		fundo.setBackground(Color.lightGray);
		
		JPanel principal = new JPanel();
		fundo.setLayout(null);
		fundo.setBounds(50,50,50,50);
		fundo.setBorder(BorderFactory.createCompoundBorder
		(BorderFactory.createLineBorder(Color.red, 6),BorderFactory.createEtchedBorder()));
				
		btnCadastrar.setBounds(30,70,300,40);
		btnCadastrar.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnCadastrar);

		btnConsultarFuncionario.setBounds(30,150,300,40);
		btnConsultarFuncionario.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnConsultarFuncionario);

		btnCadastrarProduto.setBounds(30,230,300,40);
		btnCadastrarProduto.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnCadastrarProduto);
		
		btnConsultarProduto.setBounds(30,310,300,40);
		btnConsultarProduto.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnConsultarProduto);
		
		btnConsultarNucleo.setBounds(30,380,300,40);
		btnConsultarNucleo.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnConsultarNucleo);
		
		btnCadastrarNucleo.setBounds(30,445,300,40);
		btnCadastrarNucleo.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnCadastrarNucleo);
		
		btnConsultarEmpresa.setBounds(330,70,300,40);
		btnConsultarEmpresa.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnConsultarEmpresa);
		
		btnCadastrarEmpresa.setBounds(330,150,300,40);
		btnCadastrarEmpresa.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnCadastrarEmpresa);
		
		btnCadastrarProfissao.setBounds(330,230,300,40);
		btnCadastrarProfissao.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnCadastrarProfissao);
		
		btnConsultarProfissao.setBounds(330,310,300,40);
		btnConsultarProfissao.setBackground(Color.LIGHT_GRAY);
		fundo.add(btnConsultarProfissao);
		
		btnSair.setBounds(230,530,110,40);
		btnSair.setBackground(Color.red);
		fundo.add(btnSair);
		
		JLabel direitosAutorais = new JLabel("Created by:Pedro-ESTAG. BRB:DESIS/GESIS/DITEC");
		direitosAutorais.setFont(new Font("Comic Sans MS",Font.PLAIN,(13)));
		direitosAutorais.setForeground(Color.RED);
		direitosAutorais.setBounds(10,575,500,25);
		fundo.add(direitosAutorais);
		
		btnCadastrar.addActionListener(this);
		btnConsultarFuncionario.addActionListener(this);
		btnCadastrarProduto.addActionListener(this);
		btnConsultarProduto.addActionListener(this);
		btnCadastrarNucleo.addActionListener(this);
		btnConsultarNucleo.addActionListener(this);
		btnCadastrarEmpresa.addActionListener(this);
		btnConsultarEmpresa.addActionListener(this);
		btnConsultarProfissao.addActionListener(this);
		btnCadastrarProfissao.addActionListener(this);
		btnSair.addActionListener(this);
		
		fundo.add(principal);
		add(fundo);
		setVisible(true);
		
	}
	
	public static void main(String[] args) {
		new TelaPrincipal();
	}
	public void actionPerformed(ActionEvent evt) {
		Object o = evt.getSource();
		
		if (o == btnCadastrar){
			  setVisible(false);
			  new CadastroFuncionario();
		  }
		  if (o == btnConsultarFuncionario){
			  setVisible(false);
			  TabelaFuncionarios op = new TabelaFuncionarios();
			  op.listarTodos();
		  }
		  if (o == btnSair){
			  setVisible(false);
			  }
		  if (o == btnCadastrarProduto){
			  setVisible(false);
			  new CadastroProduto();
		  }
		  if (o == btnConsultarProduto){
			 setVisible(false);
			 TabelaProdutos ok = new TabelaProdutos();
			 ok.listarTodos();
		  }
		  if (o == btnConsultarNucleo){
			 setVisible(true);
			 TabelaDeNucleos ok = new TabelaDeNucleos();
			 ok.listarTodos();
		  }
		  if (o == btnCadastrarNucleo){
			  this.setVisible(false);
			  new CadastroDeNucleos();
		  }
		  if (o == btnCadastrarEmpresa){
			  setVisible(false);
			  new CadastroEmpresas();
		  }
		  if (o == btnConsultarEmpresa){
			  setVisible(false);
			  TabelaDeEmpresas ok = new TabelaDeEmpresas();
			  ok.listarTodos();
		  }
		  if (o == btnConsultarProfissao){
			  setVisible(false);
			  TabelaProfissao ok = new TabelaProfissao();
			  ok.listarTodos();
		  }
		  if (o == btnCadastrarProfissao){
			  setVisible(false);
			  new CadastrarProfissao();
			
		  }
			
	}

}

agora vc imagine como vai ficar mais complexo de ser fazer manutenção depois que eu colocar os action listener sem os IFs.

A

outra coisa, gostaria de saber se tem como voce me mostrar um exemplo, ou so uma dica(A LÓGICA) pra eu fazer sozinho, de como se coloca MASCARA em um campo JTextField para um cpf por exemplo, igual no DELPHI… fica os tracinhos no meio do campo.

e abusando denovo, gostaria de saber, um exemplo de uma JInternalFrame, acho q é isso, quando voce clica em um botao para abrir uma outra classe, ela abre na mesma janela, sem fechar a que esta aberta.

T

Cara, o Vini já respondeu essas questões, não usar setBounds nem null em setLayout, use LayoutManagers.
Aprenda a usá-los.

Use um ActionListener independente para cada botão.

Esse código ta bem curto e simples, dá pra mudar sem dor nenhuma.

Quanto a última pergunta, dê uma olhada no JFormattedTextField.

http://www.jdk5.ru/api/javax/swing/JFormattedTextField.html

V
AssemblyXP:
ta, blz cara... mais por que eu eu devo trabalhar com THEADS, pq preciso usar no metodo main, so pra chamar a janela, sendo que do jeito que eu estava fazendo era mais prático, ta certo que se do jeito que voce me falou, for o certo, eu vou demorar um tempo pra atualizar todos os meus programas do jeito certo, e no caso do action listener, valew... me tirou umas linhas de codigos imensas do meu programa, so que depois fica mais dificil de se entender.... dificil de se procurar algum defeito que possa estar vindo de algum programa, ANALISE este outro codigo ai se puder....

Queira você ou não, só pelo fato de você iniciar uma janela do Swing, você terá duas Threads. A thread principal, que é a que roda o main, e a thread do Swing, que é quem abre a janela.

O problema é que você só pode atualizar tela na thread do Swing. Muitas vezes ferir essa regra não dá nenhum efeito visível e é aí que está o perigo da coisa. Por que, numa máquina diferente da sua, pode dar problema.

O comando EventQueue.invokeLater não cria novas threads, apesar de ter um Runnable dentro. Ele só pede para que o Swing rode o runnable na thread dele, que já existe.

Quanto ao código que você postou... o que mudou? Ainda vejo todos os problemas lá: setBounds, um único actionListener, JFrame implementado ActionListener, setVisible no construtor, nenhum campo private, etc...

Discordo de você quando você diz que fica mais fácil manter o código com aquele if gigante. Se você organizar um pouco, vai ser mais fácil manter o código quando cada componente tiver seu listener. Até pq, toda a lógica do componente vai ficar concentrada num local só. É bem comum criamos métodos para a construção dos componentes, assim:

public JButton getBtnCadastrar() {
   if (btnCadastrar != null)
      return btnCadastrar;

   btnCadastrar = new JButton("Cadastrar novos produtos");
   btnCadastrar.setBackground(Color.LIGHT_GRAY); 
   btbCadastrar.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
         dispose();;  
         new CadastroFuncionario().setVisible(true);  
      }
   });
   return btnCadastrar;
}

Para manter um código de um botão, basta achar seu respetivo método do get. E lá estará tudo: comandos para dimensiona-lo e o actionListener. E como o Eclipse e o Netbeans tem atalhos para procurar por métodos, manter um código assim fica mamão com açúcar.

A

GALERA… vlw… mais arrumei meu problema pesquisando aqui no fórum…

consegui colocar máscara nas minhas textfield… naum sabia que era tão simples…

agora o meu passo é pular para a JInternalFrame frameInternal = new JInternalFrame(); pq ainda nao sei usar na minha aplicação, fica um monte de classe, e quando eu clico em um botao, ele fecha a janela(classe) atual e abre outra, quero abrir tudo em uma só, mais eu vou descobrir…

mais está ai o código se alguem estiver com dúvida de como fazer… so olhar e entender…

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.text.MaskFormatter;

public class CampoCPF extends JFrame {
	private static final long serialVersionUID = 7651341529402801398L;

	
	JButton btnFechar = new JButton("Fechar");
	JButton btnLimpar = new JButton("Limpar");
	JFormattedTextField campoNumero = null;
	int i;
	   
	public CampoCPF(){
		super("CAMPO CPF COM MÁSCARA");
		setSize(450,150);
		setLocationRelativeTo(null);
		setUndecorated(true);
   		setDefaultCloseOperation(EXIT_ON_CLOSE);
   		setDefaultLookAndFeelDecorated(isDefaultLookAndFeelDecorated());
		getRootPane().setWindowDecorationStyle(JRootPane.WARNING_DIALOG);
		
		JPanel principal = new JPanel();
		principal.setLayout(null);
		
	    try {
			campoNumero = new JFormattedTextField(new MaskFormatter("###-###-###/##"));
			campoNumero.setFocusLostBehavior( JFormattedTextField.COMMIT);
			
		} catch (ParseException e1) {
			e1.printStackTrace();
		}
		campoNumero.setBounds(100,10,90,30);
		principal.add(campoNumero);
		
		btnFechar.setBounds(100,50,90,30);
		principal.add(btnFechar);
		
		btnLimpar.setBounds(200,50,90,30);
		principal.add(btnLimpar);
		
		principal.setBounds(10,10,50,50);
	
		    btnLimpar.addActionListener(new ActionListener() {
		    	public void actionPerformed(ActionEvent e) {  
			                 campoNumero.setText("");               
			             }  
			         });
		    btnFechar.addActionListener(new ActionListener() {  
	             public void actionPerformed(ActionEvent e) {  
	            	 setVisible(false);
	             }  
	         });    
		add(principal);
			}
	  public static void main(String[] args) {  
		         EventQueue.invokeLater(new Runnable()  
		         {  
		        	 public void run() {  
		                 new CampoCPF().setVisible(true); 
		             }  
		         });  
	  }
}

ta aii… vlwsss

J

Bem, o que você precisa é montar seu sistema (aplicativo, programa, software, etc) utilizando janelas MDI, ou seja, você tem uma janela principal, na qual você tem menus que chama suas “janelas” (módulos) dentro de um JDesktopPane que fica dentro da janela principal.

Nessa janela principal você pode ter uma barra de ferramentas (flutuante ou fixa), você pode uma barra de status no rodapé da janela, e outros componentes conforme a necessidade.

Dessa forma você terá suas classes (janelas, módulos) separados e você abre uma a uma dentro da janela principal do sistema.

Para tentar te ajudar eu criei um projetinho bem simples para demonstrar o uso do MDI (arquivo zipado anexado), provavelmente os colegas que entendem muito mais que eu vão ter muito mais a acrescentar, mesmo assim já é um início para você começar a entender.

A

pow cara valew…

me ajudou muito…

vou pegar a idéia e implementar no meu programa…

vlws

Criado 20 de dezembro de 2010
Ultima resposta 29 de dez. de 2010
Respostas 26
Participantes 7