Java Swing中如何更新作为方法参数传入的外部计数变量?
解决Java中抽离方法后无法更新外部基本类型计数变量的问题
问题的核心是Java的基本数据类型是值传递——你传入的blrS是int类型,方法参数room只是它的一个副本,方法内修改room的数值只会影响副本,不会改变外部原变量blrS的值。
下面给出三种可行的解决方案:
方案一:直接操作类成员变量(最适配你的场景)
既然你的blrS是类的成员变量(之前直接写在ActionPerformed中可以修改),可以去掉方法中的room参数,直接在方法里操作对应的类成员,或者通过参数标识要操作的计数变量(适配两个面板的不同计数)。
修改后的setComponent方法:
// 假设你有两个面板的计数变量:blrS(第一个面板)和xxxS(第二个面板) public void setComponent(javax.swing.JCheckBox component, javax.swing.JCheckBox all, boolean isBlrPanel) { System.out.println("Inside Component: "+component.isSelected()); // 根据面板类型获取对应的计数 int currentCount = isBlrPanel ? blrS : xxxS; if (component.isSelected()) { currentCount++; if (currentCount == 30) { all.setSelected(true); } if (!messagearea.getText().equals("")) { sendb.setEnabled(true); } } else { currentCount--; all.setSelected(false); if (currentCount == 0) { sendb.setEnabled(false); } } // 更新对应的类成员变量 if (isBlrPanel) { blrS = currentCount; } else { xxxS = currentCount; } System.out.println(currentCount); }
调用示例:
private void HP04ActionPerformed(java.awt.event.ActionEvent evt) { // 传入true表示操作第一个面板的blrS变量 setComponent(HP04, all_blr, true); }
方案二:返回更新后的计数,在调用处赋值
把setComponent方法改为返回int类型,将修改后的计数返回,然后在ActionPerformed方法中把返回值赋值给原变量blrS。
修改后的setComponent方法:
public int setComponent(javax.swing.JCheckBox component, int room, javax.swing.JCheckBox all) { System.out.println("Inside Component: "+component.isSelected()); if (component.isSelected()) { room++; if (room == 30) { all.setSelected(true); } if (!messagearea.getText().equals("")) { sendb.setEnabled(true); } } else { room--; all.setSelected(false); if (room == 0) { sendb.setEnabled(false); } } System.out.println(room); return room; // 返回修改后的计数 }
调用示例:
private void HP04ActionPerformed(java.awt.event.ActionEvent evt) { // 将方法返回的新值赋值给原变量blrS blrS = setComponent(HP04, blrS, all_blr); }
方案三:使用可变整数包装类
Java的基本类型包装类(如Integer)是不可变的,我们可以自己定义一个可变的整数类,通过引用传递的特性来修改原变量的数值。
定义可变整数类:
class MutableInt { private int value; public MutableInt(int initialValue) { this.value = initialValue; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public void increment() { value++; } public void decrement() { value--; } }
修改类成员变量类型:
// 把原来的int blrS替换为MutableInt实例 private MutableInt blrS = new MutableInt(0);
修改后的setComponent方法:
public void setComponent(javax.swing.JCheckBox component, MutableInt room, javax.swing.JCheckBox all) { System.out.println("Inside Component: "+component.isSelected()); if (component.isSelected()) { room.increment(); if (room.getValue() == 30) { all.setSelected(true); } if (!messagearea.getText().equals("")) { sendb.setEnabled(true); } } else { room.decrement(); all.setSelected(false); if (room.getValue() == 0) { sendb.setEnabled(false); } } System.out.println(room.getValue()); }
调用示例:
private void HP04ActionPerformed(java.awt.event.ActionEvent evt) { setComponent(HP04, blrS, all_blr); }
内容的提问来源于stack exchange,提问作者LOL - Coding ain't for me
相关产品推荐
相关产品推荐

