首页 > 解决方案 > 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!!");
            }
        }
    }
}

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

标签: javafor-loopbuttonactionlisteneractionevent

解决方案


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

你给你所有RadioButtonsActionListener当单选按钮被按下时,它当然会被调用。但是,在这些情况下,事件的来源永远不会是另一个名为 的按钮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
         }
    }
}

推荐阅读