1

我有 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

4 回答 4

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必须是一个类变量。

于 2015-05-30T16:04:54.173 回答
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);
    }
});
于 2015-05-30T15:45:49.867 回答
1

建议:

  • 创建一个字段,JToggleButton[] toggleButtons = new JToggleButton[20]
  • 或者如果您选择使用 ArrayList
  • 在您的 for 循环中创建您的 JToggleButton 并将其分配给正确的数组项。
  • 在 ActionListener 中,只需遍历数组,计算有多少 JToggleButton 项被选中。
  • 你完成了。
于 2015-05-30T15:54:19.097 回答
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();
    }
}
于 2015-05-30T16:01:54.220 回答