我正在尝试创建一个按钮,在按下按钮时打开/关闭布尔值。我已经使用类似的格式打开/关闭其他模块,它完美地工作。但是,由于某些原因我不知道,我试图将变量分配给永远不会切换的布尔值。
以下是创建布尔值的代码:
boolean rainbow = false;
panels.add(new Panel("Hub", 50, 50, false) {
public void loadElements() {
getElements().add(new ElementBoolean("Rainbow", rainbow));
}
});
这是盒子类,它获取布尔变量,并且应该打开/关闭它。
private String label;
private boolean property;
public ElementBoolean(String label, boolean property) {
super(label);
this.label = label;
this.property = property;
}
@Override
public void mouseClicked(int mX, int mY, int button)
{
switch(button) {
case 0: {
if(!isSelected(mX, mY)) return;
this.property = !this.property;
break;
}
}
}
同样,这种格式适用于处理其他模块,但是为了切换布尔值,永远不会将'属性'赋予布尔'彩虹',因为它应该如此。因此,布尔'属性'正确切换,但变量'rainbow'保持为false。如果我遗漏了一些非常简单的东西,我很抱歉,我无法理解为什么这不起作用。
没有堆栈跟踪,因为它不会产生任何错误。
答案 0 :(得分:2)
问题是原语(例如boolean)是通过值传递的,意味着当你将rainbow传递给ElementBoolean的构造函数时,Java会在堆栈中创建一个新的局部变量,无论如何都不会使用初始的rainbow变量进行引用。
你真正需要的是一个Mutable(https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/mutable/package-summary.html)
如果您不想使用Apache库,您可以自己轻松实现它:
with gzip.open(file, 'rb') as handler:
for row in csv.reader(handler, delimiter=","):
# row processing HERE
答案 1 :(得分:0)
我不确定我是否理解你,你在这里张贴的所有内容似乎都没问题,但我有一种感觉,你正试图做这样的事情:
boolean rainbow = false;
panels.add(new Panel("Hub", 50, 50, false) {
public void loadElements() {
getElements().add(new ElementBoolean("Rainbow", rainbow));
}
});
//now you click mouse
//and now you expect variable rainbow to be true after mouse clicked
if(rainbow == true)
doSomething();
要点是您没有更改变量rainbow
,而是更改property
对象实例中的变量ElementBoolean
。你需要做的是(在尝试使用彩虹之前):
rainbow = yourElementBooleanInstance.getProperty()
当然,因为它是private
,你需要使getProperty()
方法返回property
值并以某种方式保存ElementBoolean
的实例,因为你现在没有这样做(您也可以将字段property
和getProperty()
设为静态,然后执行ElementBoolean.getProperty()
。
答案 2 :(得分:0)
请参阅以下两个电话:
f(x)
new ElementBoolean("Rainbow", rainbow)
java中传递的变量(x
和rainbow
)永远不会被其他值覆盖。你总是按值传递。字段property
不是rainbow
的别名。
这是一个有意的设计决定,正如您现在所知:
String s = "happy";
p(s);
// s still will be "happy", not null or whatever