我目前正在为项目管理系统制作GUI。
无法弄清楚如何让Action Event正常工作。
以下代码行是我用于两者的代码。
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!!");
}
}
}
}
只需要弄清楚我与动作听众的关系&行动事件。
答案 0 :(得分:0)
假设所有与您的ActionListener
有关的代码,这是您的回答:
您所有RadioButtons
ActionListener
。当 THE RADIO BUTTONS 被按下时,当然会调用它。
但是,在这些情况下,事件的来源永远不会成为名为select
的其他按钮。
您似乎想在按下ActionListener
按钮时致电select
。这意味着该按钮需要ActionListener
而不是RadioButtons
。
作为旁注:
this.jRdBttn = new JRadioButton(u.getProject(i).getName());
这意味着this.jRdBttn
将只包含您在该循环结束时创建的最后一个RadioButton
。所有其他人将永远丢失,因为你没有更多的直接引用它们(当然你实际上仍然在你的组件层次结构中有它们,但是再次使用它们是一种痛苦)。
---编辑29.05.2018 ---
如果你想在每次单击一个单选按钮时做出反应(我认为这意味着你的评论)而不需要选择按钮,那么有多种方法可以实现这一点。
您使用哪种方式取决于您的使用案例。
如果我们尽可能地接近您当前的方法,我们可能需要将所有RadioButton存储在一个数组中,然后遍历该数组以找到当前选定的按钮。 您甚至不需要查看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
}
}
}