java - Java 按钮、动作事件和监听器
问题描述
我目前正在为项目管理系统开发 GUI。
无法弄清楚如何让动作事件正常工作。
以下代码行是我用于两者的代码。
public JPanel setupButtons(User u){
JPanel forButtons = new JPanel();
ButtonGroup group = new ButtonGroup();
for(int i = 0; i != u.projectSize(); i++){
this.jRdBttn = new JRadioButton(u.getProject(i).getName());
forButtons.add(jRdBttn);
group.add(jRdBttn);
jRdBttn.addActionListener(this);
jRdBttn.setEnabled(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == select){
if(this.jRdBttn.isSelected()){
System.out.println("It worked!!");
}
}
}
}
只需要弄清楚我在动作监听器和动作事件中遇到的问题。
解决方案
假设这是所有与你有关的代码ActionListener
,这就是你的答案:
你给你所有RadioButtons
的ActionListener
。当单选按钮被按下时,它当然会被调用。但是,在这些情况下,事件的来源永远不会是另一个名为 的按钮select
。
您似乎想在按下按钮ActionListener
时打电话给您。select
这意味着这是需要 anActionListener
而不是您的RadioButtons
.
作为旁注:
this.jRdBttn = new JRadioButton(u.getProject(i).getName());
这意味着this.jRdBttn
它将仅包含RadioButton
您在该循环结束时创建的最后一个。所有其他人都将永远丢失,因为您不再直接引用它们(当然,您实际上仍然在组件层次结构中拥有它们,但是以这种方式再次使用它们有点痛苦)。
--- 编辑 29.05.2018 ---
如果您想在每次单击单选按钮时做出反应(这就是我认为您的评论的意思)而不需要选择按钮,那么有多种方法可以实现这一点。
您使用哪种方式取决于您的用例。
如果我们尝试尽可能接近您当前的方法,我们可能需要将所有 RadioButtons 存储在一个数组中,然后遍历该数组以找到当前选定的按钮。您甚至不需要查看 ActionEvent 或其来源,因为您并不真正关心刚刚按下了哪个 RadioButton,只关心当前选择了哪一个。
当然,您可以争辩说刚刚按下的按钮是被选中的按钮,但是使用您当前的方法,您仍然必须遍历数组以找到索引(我假设您可能需要访问相应的项目),这基本上使它毫无意义。
所以第一步:在你的课堂上,添加这个:
private JRadioButton[] radioButtons;
下一个:
public JPanel setupButtons(User u){
JPanel forButtons = new JPanel();
ButtonGroup group = new ButtonGroup();
radioButtons = new JRadioButton[u.projectSize()]; // <- This is new
for(int i = 0; i != u.projectSize(); i++){
radioButtons[i] = new JRadioButton(u.getProject(i).getName());
forButtons.add(radioButtons[i]);
group.add(radioButtons[i]);
radioButtons[i].addActionListener(this);
radioButtons[i].setEnabled(true);
}
}
最后但并非最不重要:
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < radioButtons.length; i++) {
if (radioButtons[i].isSelected()) {
System.out.println("Button " + i + " was selected!");
// Optionally, you might want to put a break; here
}
}
}
推荐阅读
- java - 从 RabbitMQ 代理 Siddhi 作为 java 库接收消息时出错
- node.js - req.params.id 未定义,ReferencesError : id 未定义
- sql - 如何查看值子集中的每个值至少出现一次?
- javascript - 如何根据一个等值的性质得到数组中各种对象的正负值之和?
- python - 具有大可迭代的多处理
- aws-lambda - 来自 Lambda 函数的 AssumeRole 间歇性成功
- debugging - gdb 不透明符号解析已关闭
- java - 按键对对象进行分组并创建树
- javascript - 如何使用 Dynamoose 正确查询索引
- spring-boot - Spring Webflux 上传大图像文件并使用 WebClient 以流的方式发送文件