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
         }
    }
}