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