Java 构造函数中未设置布尔值
我试着做一个按钮,当按下它时,可以切换布尔值的开/关。我已经在使用一种类似的格式来切换其他模块的开/关,它工作得非常好。然而,由于一些我不知道的原因,我试图将变量赋值为的布尔值根本不会切换 以下是创建布尔值的代码:Java 构造函数中未设置布尔值,java,Java,我试着做一个按钮,当按下它时,可以切换布尔值的开/关。我已经在使用一种类似的格式来切换其他模块的开/关,它工作得非常好。然而,由于一些我不知道的原因,我试图将变量赋值为的布尔值根本不会切换 以下是创建布尔值的代码: boolean rainbow = false; panels.add(new Panel("Hub", 50, 50, false) { public void loadElements() { getElements().
boolean rainbow = false;
panels.add(new Panel("Hub", 50, 50, false) {
public void loadElements() {
getElements().add(new ElementBoolean("Rainbow", rainbow));
}
});
这里是box类,它获取布尔变量,应该将其打开/关闭
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;
}
}
}
同样,这种格式适用于处理其他模块,但对于切换布尔值,它从来不会像预期的那样将“属性”指定给布尔值“彩虹”。因此,布尔值“property”被正确切换,但变量“rainbow”保持为false。我很抱歉,如果我遗漏了一些非常简单的东西,我就是不明白为什么这不起作用
没有堆栈跟踪,因为它不会生成任何错误。问题是原语(例如布尔)是按值传递的,这意味着当您将rainbow传递给ElementBoolean的构造函数时,Java会在堆栈中创建一个新的局部变量,该变量无论如何都不会被初始rainbow变量引用。 您实际需要的是一个可变的()
如果您不想使用Apache库,可以自己轻松实现:
public class Mutable<T> {
private T value;
public Mutable(final T value) {
this.value = value;
}
public T get() {
return this.value;
}
public void set(final T value) {
this.value = value;
}
}
公共类可变{
私人T值;
公共可变(最终T值){
这个值=值;
}
公共部门得不到{
返回此.value;
}
公共无效集(最终T值){
这个值=值;
}
}
我不确定我是否理解您,您在这里发布的所有内容似乎都正常,但我感觉您正在尝试这样做:
布尔彩虹=false;
面板。添加(新面板(“轮毂”,50,50,假){
公共void loadElements(){
getElements().add(newelementboolean(“Rainbow”,Rainbow));
}
});
//现在你点击鼠标
//现在,您希望鼠标点击后变量彩虹为真
如果(彩虹==真)
doSomething();
关键是您没有更改变量rainbow
,而是在ElementBoolean
对象实例中更改变量属性。您需要做的是(在尝试使用rainbow之前):
rainbow=yourElementBooleanInstance.getProperty()
当然,由于它是私有的
,您需要创建一个getProperty()
方法返回property
值,并以某种方式保存ElementBoolean
的实例,因为您现在没有这样做(您还可以创建fieldproperty
和getProperty()
static,然后执行ElementBoolean.getProperty()
查看以下两个调用:
f(x)
new ElementBoolean("Rainbow", rainbow)
传递的变量(x
和rainbow
)在java中永远不会被另一个值覆盖。您总是通过值传递。字段属性
不是rainbow
的别名
正如您现在所知,这是一个有意的设计决策:
String s = "happy";
p(s);
// s still will be "happy", not null or whatever
这里有一些很好的进一步阅读:制作final boolean rainbound
会改变什么吗?谢谢大家的回答,我改为MutableBoolean而不是boolean,它解决了这个问题。