检查哪些 jRadioButtons 已被选中(如果它们是在循环中创建的)
Check which jRadioButtons have been selected if they have been created in a loop
我有一个创建行的循环,其中每一行都有另一个循环来创建 6 个 JRadioButtons。
只能从每一行中选择一个 JRadioButton(应该如此),但我发现很难使用 Action Listeners 检查是否从每一行中选择了正确的 JRadioButton,然后更改一个空的JLabel 以显示 "correct",但我认为一旦我完成了第一部分,这将很简单。
这是我正在使用的相关代码:
//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;
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;
final ButtonGroup btnG = bg;
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("row " + row);
System.out.println("btn " + btnG.getSelection().getActionCommand());
}
};
//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);
}
//add each row of letters (jpLine) to this loops jpanel
jpCenterCenter.add(jpLine);
}
此外,我要检查的正确 JRadioButton 是在 if(ranNumber == j) 部分中创建的那些。
对不起,如果我拖延了,但我发现这很难解释,所以希望有人能提供帮助!
您可以在每个按钮上使用 setActionCommand("" + j)
将每个按钮与其索引相关联,然后使用 bg.getSelection().getActionCommand()
获取任何组中所选按钮的索引。然后,您可以将单个 ActionListener 分配给一组中的所有按钮,并确保动作侦听器知道它附加到哪一行。
// in your "i" loop
final int row = i; // must be final to be used inside the anonymous class
final ButtonGroup btnG = bg;
final String answerAction = "" + ranNumber; // hard to tell if this is what you mean
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("row " + row);
String selectedAction = btnG.getSelection().getActionCommand();
System.out.println("btn " + selection);
boolean isCorrectForThisRow = (answerAction == selectedAction);
System.out.println("is correct: " + isCorrectForThisRow);
}
};
// in your "j" loop, with either the answerLetter or k buttons
// as required
k.setActionCommand("" + j);
k.addActionListener(listener);
就目前而言,您的示例中有很多不太合理的地方,因此很难提出更多建议(例如 - while(true)
循环在第一次迭代时中断) .但是 setActionCommand
就是要以这种方式使用 (oracle tutorial here) 来找出按钮组中选中了哪个按钮。
我有一个创建行的循环,其中每一行都有另一个循环来创建 6 个 JRadioButtons。
只能从每一行中选择一个 JRadioButton(应该如此),但我发现很难使用 Action Listeners 检查是否从每一行中选择了正确的 JRadioButton,然后更改一个空的JLabel 以显示 "correct",但我认为一旦我完成了第一部分,这将很简单。
这是我正在使用的相关代码:
//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;
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;
final ButtonGroup btnG = bg;
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println("row " + row);
System.out.println("btn " + btnG.getSelection().getActionCommand());
}
};
//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);
}
//add each row of letters (jpLine) to this loops jpanel
jpCenterCenter.add(jpLine);
}
此外,我要检查的正确 JRadioButton 是在 if(ranNumber == j) 部分中创建的那些。
对不起,如果我拖延了,但我发现这很难解释,所以希望有人能提供帮助!
您可以在每个按钮上使用 setActionCommand("" + j)
将每个按钮与其索引相关联,然后使用 bg.getSelection().getActionCommand()
获取任何组中所选按钮的索引。然后,您可以将单个 ActionListener 分配给一组中的所有按钮,并确保动作侦听器知道它附加到哪一行。
// in your "i" loop
final int row = i; // must be final to be used inside the anonymous class
final ButtonGroup btnG = bg;
final String answerAction = "" + ranNumber; // hard to tell if this is what you mean
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("row " + row);
String selectedAction = btnG.getSelection().getActionCommand();
System.out.println("btn " + selection);
boolean isCorrectForThisRow = (answerAction == selectedAction);
System.out.println("is correct: " + isCorrectForThisRow);
}
};
// in your "j" loop, with either the answerLetter or k buttons
// as required
k.setActionCommand("" + j);
k.addActionListener(listener);
就目前而言,您的示例中有很多不太合理的地方,因此很难提出更多建议(例如 - while(true)
循环在第一次迭代时中断) .但是 setActionCommand
就是要以这种方式使用 (oracle tutorial here) 来找出按钮组中选中了哪个按钮。