estou querendo que em um frame quando for selecionado a pergunta certa. seja sorteado de um ArrayList a proxima pergunta. eu fiz só q imprime todos os labels de teste q fiz.
quando selecionado o botao correto o seguinte metodo eh chamado:
static Vector vetorFase1;
void sortearPergunta(){
vetorFase1 = new Vector();
Perguntas per = new Perguntas();
per.pergunta1();
Perguntas per2 = new Perguntas();
per2.pergunta2();
Perguntas per3 = new Perguntas();
per3.pergunta3();
Perguntas per4 = new Perguntas();
per4.pergunta4();
vetorFase1.addElement(per.pergunta1());
vetorFase1.addElement(per2.pergunta2());
vetorFase1.addElement(per3.pergunta3());
vetorFase1.addElement(per4.pergunta4());
ArrayList <Perguntas> po = new ArrayList<Perguntas>();
po.add(0, per.pergunta1());
po.add(1,per2.pergunta2());
po.add(2,per3.pergunta3());
po.add(3,per4.pergunta4());
Collections.shuffle(po);
Random op = new Random();
op.nextInt();
}
quando chama vem todos os labels da classe q fiz! que estao dentro de metodos da mesma. ^^
Não use Vector, nem variáveis static.
Você poderia ter usado só o ArrayList, que é bem melhor.
Para sortear, você tem 2 opções:
a) Se você não quer perguntas repetidas: Use o método Collections.shuffle para embaralhar uma lista. Em seguida, é só pegar cada elemento da lista em ordem.
b) Se você pode repetir: Nesse caso, use a classe Random para sortear um dos índices da lista;
ficaria mais ou menos assim neh?
so que nao consigo limitar o “po” dentro do for… pra um intervalo de 0-4.
[code] void sortearPergunta(){
Perguntas per = new Perguntas();
per.pergunta1();
Perguntas per2 = new Perguntas();
per2.pergunta2();
Perguntas per3 = new Perguntas();
per3.pergunta3();
Perguntas per4 = new Perguntas();
per4.pergunta4();
ArrayList <Perguntas> po = new ArrayList<Perguntas>();
po.add(0, per);
po.add(1,per2);
po.add(2,per3);
po.add(3,per4);
Collections.shuffle(po);
Random op = new Random(4);
for (int i = 0; i <1; i++) {
po.get(op.nextInt());
}
[/code]
É só passar 4 no parâmetro do nextInt():
po.get(op.nextInt(4));
E retire o 4 da inicialização do Random, essa é a semente que define os números que serão gerados. Se deixar ele lá as perguntas sempre serão sorteadas na mesma ordem.
eu fiz o que tu me mandou mais ainda chama todos os labels da classe pergunta. Nao seria necessario fazer alguma alteração na classe nao??
vlw pelas respostas!
public class Perguntas {
JLabel lab,lab2,lab3,lab4;
Perguntas pergunta1(){
Fase1.pergunta1.setVisible(false);
Fase1.rad12.setVisible(false);
Fase1.rad13.setVisible(false);
Fase1.ok.setVisible(false);
Fase1.rad11.setVisible(false);
lab = new JLabel("LAB0");
lab.setBounds(15,100,180,20);
Fase1.perg.add(lab);
return null;
}
Perguntas pergunta2(){
Fase1.pergunta1.setVisible(false);
Fase1.rad12.setVisible(false);
Fase1.rad13.setVisible(false);
Fase1.ok.setVisible(false);
Fase1.rad11.setVisible(false);
lab2 = new JLabel("LAB1");
lab2.setBounds(15,150,180,20);
Fase1.perg.add(lab2);
return null;
}
Perguntas pergunta3(){
Fase1.pergunta1.setVisible(false);
Fase1.rad12.setVisible(false);
Fase1.rad13.setVisible(false);
Fase1.ok.setVisible(false);
Fase1.rad11.setVisible(false);
lab3 = new JLabel("LAB2");
lab3.setBounds(15,200,180,20);
Fase1.perg.add(lab3);
return null;
}
Perguntas pergunta4(){
Fase1.pergunta1.setVisible(false);
Fase1.rad12.setVisible(false);
Fase1.rad13.setVisible(false);
Fase1.ok.setVisible(false);
Fase1.rad11.setVisible(false);
lab4 = new JLabel("LAB3");
lab4.setBounds(15,250,180,20);
Fase1.perg.add(lab4);
return null;
}
}
Quantas perguntas você quer sortear?
Com o shuffle, não é necessário usar o random. Ele já embaralha a lista de perguntas para você.
Para uma pergunta só, basta pegar a primeira pergunta após o shuffle.
só quero sortear uma. seu retirar o random o for continua neh?
Então fica assim:
Random op = new Random();
po.get(op.nextInt(4));
Sem for.
fiz mas mesmo assim continua chamando os labels. vlw pela força!