如何捕获一组循环生成的 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 变量。
我有 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 变量。