gpt4 book ai didi

java - 单击按钮后处理 RadioButton 事件

转载 作者:行者123 更新时间:2023-12-01 23:23:33 24 4
gpt4 key购买 nike

帮助,我的问题是:

  1. 为什么没有触发 itemStateChanges,我尝试将其放入内部类 ButtonHandler 以及 RadioButtonHandler 中,我有遇到麻烦了,正确的方法是什么?我想在用户单击“检查”按钮后触发并检查标记的 JRadioButtons。

  2. 检查单击了哪个按钮的正确方法是什么,我觉得比较字符串是不好的编程习惯。也许使用 ID?

  3. 我应该如何制作一个“重置”按钮(重新开始),我想取消选中所有单选按钮并再次运行构造函数。

感谢您的帮助!

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"));

}

}
}

最佳答案

why "itemStateChanges" isn't triggered, i tried to put it in the inner class "ButtonHandler" and also in "RadioButtonHandler" Im having troubles with it, what is the right way to do it? I want to trigger and check the marked JRadioButtons after the user click the "check" button.

ButtonHandler是用 ActionListener 实现的仅:

  public class ButtonHandler implements ActionListener{}

itemStateChanged(ItemEvent)功能属于ItemListener 。如果注册此监听器的源组件的状态发生更改,则会触发此函数。因此实现ItemListener 。然而,还有一件事需要注意,即 JButton不响应ItemListener但是JRadioButton将要。因为这个Item事件由实现 ItemSelectable 的组件触发界面。此类组件的一些示例包括:复选框、检查菜单项、切换按钮和包括单选按钮的组合框,如上所述。

<小时/>

What is the right way to check which button was clicked, i feel like comparing the strings is wrong programming. Maybe using an ID

很好用事件源功能: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
}
}
<小时/>

How should i make a "reset" button(start over), i want to uncheck all radio buttons and run the constructor once again.

那么您正在使用 ButtonGroup 。和ButtonGroup有一个很好的功能: clearSelection() 帮助您完成您想要的任何事情(我无法理解该部分:运行构造函数部分)。

编辑:正如您希望我看到的 ItemListener实现的类,是的,我可以看到但是:

  1. 在对 a1.addItemListener(handler); 所属的组件执行任何操作之前,我看不到您实际上已向任何组件注册了该类 ( ButtonHandler ) 的实例。注册为:checkMe, refresh
  2. 除此之外,在此操作执行函数中,您正在检查操作命令,您甚至还没有使用 JButton.setActionCommand(String) 设置该命令功能。 您不应根据另一个(操作)监听器的事件发生来分配一个(项目)监听器。

教程:

  1. How to Write an ItemListener
  2. How to Write an ActionListener
  3. How to Use the ButtonGroup Component

关于java - 单击按钮后处理 RadioButton 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com