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

时间:2015-05-30 15:13:02

标签: java swing jtogglebutton

我有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才能访问它,因此它不是解决方案。

4 个答案:

答案 0 :(得分:2)

如果您在循环中声明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必须是一个类变量。

答案 1 :(得分:1)

创建一个将计算所选切换次数的类属性:

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

答案 2 :(得分:1)

建议:

  • 创建一个字段JToggleButton[] toggleButtons = new JToggleButton[20]
  • 如果您选择
  • ,请使用ArrayList
  • 在for循环中创建JToggleButton并将其分配给正确的数组项。
  • 在ActionListener中,只需遍历数组,计算选择了多少JToggleButton项目。
  • 你已经完成了。

答案 3 :(得分:1)

有很多方法可以完成这项工作,最好的方法取决于代码的其余部分。我试着把它保持在你的附近。

您可以在循环中将按钮声明为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();
    }
}