如何捕获一组循环生成的 JToggleButton 的点击量?

How to capture the amount of clicks over a group of loop generated JToggleButtons?

我有 20 个循环生成的 JToggleButtons,我需要计算其中有多少是活动的。

private void generarBotones(){    
    JToggleButton b;
    this.panelCuerpo.setLayout(new GridLayout(4,5));        
    for(int i = 1; i<=20; i++){
        b = new JToggleButton();
        b.setText(String.valueOf(i));
        this.panelCuerpo.add(b);
        b.addActionListener(new ActionListener() {
            int clicks = 0;
            @Override
            public void actionPerformed(ActionEvent ae2){
                clicks = clicks + 1;
                System.out.println(clicks);
            }                
            public void setCantidadBoletas(int clicks){
                cantidadBoletas = clicks;
            }
        });
    }   
}

这里的问题是它计算的是它们中的每一个被点击的次数,而不是计算它们被选中的次数。

PS。我尝试使用 (b.isSelected()),但 b 需要 final 才能访问它,所以这不是解决方案。

创建一个 class 属性来统计所选的切换:

private int selectedCount;

在构造函数中将计数器初始化为 0:

this.selectedCount = 0;

每次切换状态更改时增加或减少计数器:

b.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent ev) {
        if (ev.getStateChange() == ItemEvent.SELECTED){
             YourClass.this.selectedCount++;
        } else if (ev.getStateChange() == ItemEvent.DESELECTED){
             YourClass.this.selectedCount--;
        }
        System.out.println(YourClass.this.selectedCount);
    }
});

建议:

  • 创建一个字段,JToggleButton[] toggleButtons = new JToggleButton[20]
  • 如果您愿意,也可以使用 ArrayList
  • 在您的 for 循环中创建您的 JToggleButton 并将其分配给适当的数组项。
  • 在 ActionListener 中,只需遍历数组,计算其 JToggleButton 项目被选中的数量。
  • 大功告成。

有很多方法可以完成这项工作,最好的方法取决于您的其余代码。我尽量让它靠近你的。

您可以在循环中将按钮声明为 final 并保留所选按钮数量的全局计数,这将在 ActionListener:

中修改
public class ButtonsCount extends JFrame {

    int clicks = 0;

    ButtonsCount() {

        JLabel label = new JLabel("0");
        JPanel buttonsPanel = new JPanel(new GridLayout(4,5));

        for(int i = 1; i <= 20; i++) {
            final JToggleButton b = new JToggleButton();
            b.setText(String.valueOf(i));
            buttonsPanel.add(b);
            b.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent ae2){
                    if (b.isSelected())
                        label.setText(String.valueOf(++clicks));
                    else
                        label.setText(String.valueOf(--clicks));
                }
            });
        }

        add(buttonsPanel);
        add(label, BorderLayout.PAGE_END);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {

        new ButtonsCount();
    }
}

如果你在循环内声明JToggleButton,你可以使它成为final

for (int i = 1; i<=20; i++) {
    JToggleButton b = new JToggleButton();

那么你可以使用b.isSelected:

    b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            if (b.isSelected())
                clicks++;
            else
                clicks--;
        }
    });
}

clicks 必须是一个 class 变量。