帮助, 我的问题是:
为什么itemStateChanges
没有被触发,我试图把它放在内部班ButtonHandler
和RadioButtonHandler
我遇到问题,这是正确的方法去做吧?
我想在用户点击“检查”按钮后触发并检查标记的JRadioButtons。
检查点击哪个按钮的正确方法是什么,我觉得比较字符串是不好的编程习惯。也许使用ID?
如何制作“重置”按钮(重新开始),我想取消选中所有单选按钮并再次运行构造函数。
感谢您的帮助!
import 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"));
}
}
}
答案 0 :(得分:3)
为什么“itemStateChanges”没有被触发,我试图把它放在内部 类“ButtonHandler”以及“RadioButtonHandler”我有 麻烦,做正确的方法是什么?我想触发 用户点击“检查”后检查标记的JRadioButtons 按钮。
ButtonHandler
仅与ActionListener
实施:
public class ButtonHandler implements ActionListener{}
itemStateChanged(ItemEvent)
函数属于ItemListener
。如果注册此侦听器的源组件的状态发生更改,则会触发此函数。所以实现ItemListener
。但是,还有一点需要注意,JButton
不响应ItemListener
,而JRadioButton
会响应Item
。因为实现ItemSelectable
接口的组件会触发此e.getSource()
事件。这些组件的一些示例是:复选框,检查菜单项,切换按钮和组合框,包括如上所述的单选按钮。
检查点击哪个按钮的正确方法是什么,我觉得 比较字符串是错误的编程。也许使用ID
使用事件源函数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
我应该怎么做一个“重置”按钮(重新开始),我想取消选中所有 单选按钮并再次运行构造函数。
您正在使用ButtonGroup
。 ItemListener
有一个很好的功能:clearSelection()
可以帮助你做任何事情(我无法理解这部分:运行构造函数部分)。
编辑:您希望我看到a1.addItemListener(handler);
已实施的课程,是的,我可以看到但是:
ButtonHandler
注册到的组件执行任何操作之前,我无法看到您实际向任何组件注册了该类的实例(checkMe, refresh
):JButton.setActionCommand(String)
<强>教程:强>