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
的实例,因为您现在没有这样做(您还可以创建field
property
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,它解决了这个问题。