对于我通过循环创建的每一行JRadioButtons,我发现很难确保每行都不重复字母。如果相同的字母存在于不同的行上,我不介意。
有什么想法吗?
提前致谢。
以下是相关代码:
//loop for making flow layout for each line of random letters
//counter for having number of the row next to each row in order of selection
int counter = x;
//array of booleans
boolean[] responses = new boolean[x];
for(int i = 0; i < x; i++)
{
//new jpanel created for every row needed for the word
JPanel jpLine = new JPanel(new FlowLayout());
//new jlabel made with counter number for each row
JLabel count = new JLabel(Integer.toString(counter));
jpLine.add(count);
counter--;
//random number from 0-5 generated for each row
Random number = new Random();
int low = 0;
int high = 5;
int ranNumber = number.nextInt((high - low) + low);
//buttongroup outside loop so only one button can be pressed for each row
ButtonGroup bg = new ButtonGroup();
//get selected button's index in any group with bg.getSelection().getActionCommand()
final int row = i;
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String action = e.getActionCommand();
if (action.equals("Incorrect")) {
responses[row] = false;
}
else {
responses[row] = true;
//System.out.println("row " + row);
//System.out.println("btn " + action);
}
if(checkAnswers(responses) == true)
{
correct.setText("<html><font color = 'white'>correct</font></html>");
}
}
};
//loop for making the number of letters in each row - always going to be 6 letters to choose from in each row
for(int j = 0; j < 5; j++)
{
//if the random number generated for each row equals the loop
//then new radiobutton will be created for the ith letter of the reversed
//answer, starting from charAt 0 and going to the last character
if(ranNumber == j)
{
JRadioButton answerLetter = new JRadioButton("<html><font color = 'white'>" + answerForGrid.charAt(i) + "</font></html>");
bg.add(answerLetter);
answerLetter.setBackground(Color.decode("#566771"));
answerLetter.setOpaque(true);
jpLine.add(answerLetter);
//use setActionCommand("" + j) on each button to associate each button with its index
answerLetter.setActionCommand("" + j);
answerLetter.addActionListener(listener);
}
//ranLetter is generated randomly from the alphabet string, so random letters are
//created for each jradiobutton
final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final int N = alphabet.length();
Random letter = new Random();
char ranLetter;
while(true)
{
ranLetter = alphabet.charAt(letter.nextInt(N));
break;
}
JRadioButton k = new JRadioButton("<html><font color = 'white'>" + ranLetter + "</font></html>");
bg.add(k);
k.setBackground(Color.decode("#566771"));
k.setOpaque(true);
jpLine.add(k);
k.setActionCommand("Incorrect");
k.addActionListener(listener);
}
//add each row of letters (jpLine) to this loops jpanel
jpCenterCenter.add(jpLine);
}
答案 0 :(得分:2)
ArrayList<Character>
个字母。 size()
为列表生成随机索引。remove
从列表中选择的字母例如:
// One possible way of creating your list
// Reset your list within each "i" loop, just before the "j" loop,
// or you'll never repeat letters across rows
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ArrayList<Character> possibleLetters = new ArrayList<Character>(alphabet.length);
for (char c : alphabet) possibleLetters.add(c);
// now select randomly "without replacement"
for (int j = 0; i < 5; j++) {
int index = number.nextInt(possibleLetters.size());
String letter = possibleLetters.remove(index);
}
您也可以这样做:
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ArrayList<Character> possibleLetters = new ArrayList<Character>(alphabet.length);
for (char c : alphabet) possibleLetters.add(c);
Collections.shuffle(possibleLetters); // optionally: shuffle(possibleLetters, number)
for (int j = 0; i < 5; j++) {
String letter = possibleLetters.get(j);
}
如果你这样做,你不需要每次都重置它,你每次只能shuffle
。
答案 1 :(得分:1)
您可以使用List
和Collections.shuffle
的组合来随机化可用字符列表,例如......
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
List<String> values = new ArrayList<>(Arrays.asList(alphabet.split("")));
for (int row = 0; row < 10; row++) {
Collections.shuffle(values);
for (int col = 0; col < 5; col++) {
System.out.print(values.get(col));
}
System.out.println("");
}
因为每个字符只出现在List
一次,所以不可能得到重复,但使用Collections.shuffle
负责每行的随机化过程。
当然,这取决于你被允许使用这些库;)
答案 2 :(得分:-1)
没有深入研究JRadioButtons的代码和东西,我认为随机排列就是你要锁定的东西。