【问题标题】:Java Buttons, Action Events & ListenersJava 按钮、动作事件和监听器
【发布时间】:2018-05-28 13:03:46
【问题描述】:

我目前正在开发项目管理系统的 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!!");
            }
        }
    }
}

只需要弄清楚我在动作侦听器和动作事件方面遇到的问题。

【问题讨论】:

  • “只需要弄清楚我在动作监听器和动作事件方面遇到的问题。” 你能告诉我们这个问题可能是什么吗?那会很有帮助。
  • 好的,所以 action 事件实际上并没有做任何事情。我只需要让它们工作,这样我就可以让它基于另一个 for 循环创建更多按钮,基本上重用相同的代码
  • 您在if(e.getSource() == select) 中使用的选择变量是什么?
  • 那是一个不同的按钮

标签: java for-loop button actionlistener actionevent


【解决方案1】:

假设这就是与您的ActionListener 有关的所有代码,这就是您的答案:

你给你所有的RadioButtons 一个ActionListener。当无线电按钮被按下时,它当然会被调用。 但是,在这些情况下,事件的来源将永远不会是另一个名为 select 的按钮。

您似乎想在按下select 按钮时呼叫您的ActionListener。这意味着该按钮需要ActionListener 而不是您的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
         }
    }
}

【讨论】:

  • 好的,如果我删除选择按钮,我将如何使用 for-loop 生成的所有按钮
  • 非常感谢。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2017-03-08
  • 2020-08-26
  • 2022-08-15
  • 2014-07-14
  • 1970-01-01
相关资源
最近更新 更多