Java 单击按钮后处理RadioButton事件
救命啊,, 我的问题是:Java 单击按钮后处理RadioButton事件,java,swing,jpanel,jradiobutton,buttongroup,Java,Swing,Jpanel,Jradiobutton,Buttongroup,救命啊,, 我的问题是: 为什么没有触发itemStateChanges,我试着把它放在内部类ButtonHandler中,也放在RadioButtonHandler中,我遇到了问题,正确的方法是什么? 我想在用户单击“检查”按钮后触发并检查标记的JRadioButtons 检查单击哪个按钮的正确方法是什么,我觉得比较字符串是不好的编程实践。也许用身份证 如何创建“重置”按钮(重新开始),我想取消选中所有单选按钮并再次运行构造函数 谢谢你的帮助 import java.awt.*; import
itemStateChanges
,我试着把它放在内部类ButtonHandler
中,也放在RadioButtonHandler
中,我遇到了问题,正确的方法是什么?
我想在用户单击“检查”按钮后触发并检查标记的JRadioButtonsimport java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class ExamFrame extends JFrame {
static ArrayList<Question> qArrList;
JRadioButton a1,a2,a3,a4;
public ExamFrame() {
super("Quiz");
setLayout(new GridLayout(0, 1));
GridBagConstraints gbc = new GridBagConstraints();
Exam exam = new Exam();
qArrList = exam.getExam();
int count=0;
for(Question q : qArrList){
count++;
JLabel questionLabel = new JLabel(count+". "+q.getQustion()); //swing constant ?
ArrayList<String> ansRand = q.getAllRandomAns();
a1 = new JRadioButton(ansRand.get(0));
a2 = new JRadioButton(ansRand.get(1));
a3 = new JRadioButton(ansRand.get(2));
a4 = new JRadioButton(ansRand.get(3));
add(questionLabel);
add(a1);add(a2,gbc);add(a3);add(a4);
ButtonGroup radioGroup = new ButtonGroup(); //logical relationship
radioGroup.add(a1);radioGroup.add(a2);radioGroup.add(a3);radioGroup.add(a4);
}
//buttons:
JButton checkMe = new JButton("Check Exam");
JButton refresh = new JButton("Start Over");
ButtonHandler handler = new ButtonHandler();
checkMe.addActionListener(handler);
refresh.addActionListener(handler);
add(checkMe);
add(refresh);
}
/** Listens to the radio buttons. */
public class ButtonHandler implements ActionListener
{
public void actionPerformed (ActionEvent e) {
if(e.getActionCommand().equals("Start Over")){ //id?
//how to do this?
}
else{
RadioButtonHandler handler = new RadioButtonHandler();
a1.addItemListener(handler);
System.out.println("success?");
}
JOptionPane.showMessageDialog(ExamFrame.this, String.format("You pressed: %s", e.getActionCommand()));
}
public void itemStateChanged(ItemEvent e) //can i add it here?
{
JOptionPane.showMessageDialog(ExamFrame.this, String.format("yes?"));
System.out.println("success!");
}
}
public class RadioButtonHandler implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
JOptionPane.showMessageDialog(ExamFrame.this, String.format("radio state changed"));
}
}
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入javax.swing.*;
公共类ExamFrame扩展了JFrame{
静态ArrayList-qArrList;
JRadioButton a1、a2、a3、a4;
公共ExamFrame(){
超级(“测验”);
setLayout(新的GridLayout(0,1));
GridBagConstraints gbc=新的GridBagConstraints();
考试=新考试();
qArrList=exam.getExam();
整数计数=0;
关于(问题q:qArrList){
计数++;
JLabel questionLabel=newjlabel(count+“+q.getQustion());//swing常量?
ArrayList ansRand=q.getAllRandomAns();
a1=新的JRadioButton(ansRand.get(0));
a2=新的JRadioButton(ansRand.get(1));
a3=新的JRadioButton(ansRand.get(2));
a4=新的JRadioButton(ansRand.get(3));
添加(问题标签);
增补(a1);增补(a2,gbc);增补(a3);增补(a4);
ButtonGroup radioGroup=新建ButtonGroup();//逻辑关系
射线组添加(a1);射线组添加(a2);射线组添加(a3);射线组添加(a4);
}
//按钮:
JButton checkMe=新JButton(“检查检查”);
JButton refresh=新JButton(“重新开始”);
ButtonHandler处理程序=新建ButtonHandler();
checkMe.addActionListener(处理程序);
addActionListener(处理程序);
添加(检查我);
添加(刷新);
}
/**听单选按钮*/
公共类ButtonHandler实现ActionListener
{
已执行的公共无效操作(操作事件e){
如果(例如getActionCommand().equals(“重新开始”){//id?
//如何做到这一点?
}
否则{
RadioButtonHandler处理程序=新的RadioButtonHandler();
a1.addItemListener(处理程序);
System.out.println(“成功?”);
}
JOptionPane.showMessageDialog(ExamFrame.this,String.format(“您按下了:%s”,例如getActionCommand());
}
public void itemStateChanged(ItemEvent e)//我可以在这里添加它吗?
{
showMessageDialog(ExamFrame.this,String.format(“是?”);
System.out.println(“成功!”);
}
}
公共类RadioButtonHandler实现ItemListener
{
公共无效itemStateChanged(ItemEvent e)
{
showMessageDialog(ExamFrame.this,String.format(“无线电状态已更改”);
}
}
}
为什么“itemStateChanges”没有被触发,我试着把它放在内部
类“ButtonHandler”和“RadioButtonHandler”中,我有
遇到麻烦时,正确的方法是什么?我想触发
并在用户单击“检查”后检查标记的JRadioButtons
按钮
ButtonHandler
仅通过ActionListener
实现:
public class ButtonHandler implements ActionListener{}
itemStateChanged(ItemEvent)
函数属于ItemListener
。如果此侦听器注册到的源组件的状态发生更改,则会触发此函数。因此,实现itemstener
。然而,还有一件事需要注意,JButton
不会响应itemstener
,但是JRadioButton
会响应。因为此项
事件由实现项可选择
接口的组件触发。此类组件的一些示例包括:复选框、复选菜单项、切换按钮和组合框,包括上述单选按钮
我觉得,检查哪个按钮被点击的正确方法是什么 比较字符串是错误的编程。也许用身份证 使用事件源函数:
e.getSource()
,检查源的类型是否为您期望的类型,并将其转换为适当的类型。然后您可以使用getName(String)
函数检查您期望的名称。当然,在初始化组件之后,应该使用setName(String)
分配名称。或者,如果组件引用是在类上下文中声明的,并且您可以直接访问该组件,则直接使用该组件引用
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getSource() instanceof JCheckBox)
{
JCheckBox checkBox = (JCheckBox)e.getSource();
if(checkBox.getName().equals("expectedName"))
; // do my thing
}
}
我应该如何做一个“重置”按钮(重新开始),我想取消选中所有 单选按钮,然后再次运行构造函数 您正在使用
按钮组
。而且ButtonGroup
有一个很好的功能:帮助你做任何你想做的事情(我不理解部分:运行构造函数部分)
Edit:您希望我看到一个itemstener
实现的类,是的,我可以看到,但是:
ButtonHandler
的组件执行任何操作之前,我看不出您是否已将该类的实例(a1.addItemListener(handler);
)注册到任何组件:检查我,刷新