Java 按钮、动作事件和监听器
Java Buttons, Action Events & Listeners
我目前正在为项目管理系统开发 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
。当 THE RADIO BUTTONS 被按下时,当然会调用它。
但是,在这些情况下,事件的来源 永远不会 是另一个名为 select
.
的按钮
您似乎想在按下 select
按钮时调用您的 ActionListener
。这意味着该按钮需要 ActionListener
而不是您的 RadioButtons
.
旁注:
this.jRdBttn = new JRadioButton(u.getProject(i).getName());
这意味着 this.jRdBttn
将只包含您在该循环结束时创建的最后一个 RadioButton
。所有其他人将永远丢失,因为您没有更多直接引用它们(当然,您实际上仍然在组件层次结构中拥有它们,但以这种方式再次使用它们是一种痛苦)。
--- 编辑 29.05.2018 ---
如果您想在每次单击单选按钮时做出反应(我认为您在评论中的意思)而不需要 select 按钮,可以通过多种方式实现。
您使用哪种方式很大程度上取决于您的用例。
如果我们尝试尽可能接近您当前的方法,我们可能需要将所有 RadioButton 存储在一个数组中,然后遍历该数组以找到当前 selected 按钮。
您甚至不需要查看 ActionEvent 或其来源,因为您并不关心刚刚按下了哪个 RadioButton,只关心当前按下了哪个 RadioButton。selected.
当然,您可以争辩说刚刚按下的按钮就是 selected 的按钮,但是使用您当前的方法,您仍然需要遍历数组以找到索引 (我假设您可能需要访问相应的项目),这基本上使它变得毫无意义。
所以第一步:在你的 class 中添加:
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
}
}
}
我目前正在为项目管理系统开发 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
。当 THE RADIO BUTTONS 被按下时,当然会调用它。
但是,在这些情况下,事件的来源 永远不会 是另一个名为 select
.
您似乎想在按下 select
按钮时调用您的 ActionListener
。这意味着该按钮需要 ActionListener
而不是您的 RadioButtons
.
旁注:
this.jRdBttn = new JRadioButton(u.getProject(i).getName());
这意味着 this.jRdBttn
将只包含您在该循环结束时创建的最后一个 RadioButton
。所有其他人将永远丢失,因为您没有更多直接引用它们(当然,您实际上仍然在组件层次结构中拥有它们,但以这种方式再次使用它们是一种痛苦)。
--- 编辑 29.05.2018 ---
如果您想在每次单击单选按钮时做出反应(我认为您在评论中的意思)而不需要 select 按钮,可以通过多种方式实现。
您使用哪种方式很大程度上取决于您的用例。
如果我们尝试尽可能接近您当前的方法,我们可能需要将所有 RadioButton 存储在一个数组中,然后遍历该数组以找到当前 selected 按钮。 您甚至不需要查看 ActionEvent 或其来源,因为您并不关心刚刚按下了哪个 RadioButton,只关心当前按下了哪个 RadioButton。selected.
当然,您可以争辩说刚刚按下的按钮就是 selected 的按钮,但是使用您当前的方法,您仍然需要遍历数组以找到索引 (我假设您可能需要访问相应的项目),这基本上使它变得毫无意义。
所以第一步:在你的 class 中添加:
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
}
}
}