2016-09-16 49 views
1

我试图做一个按钮,当它被按下时,开关一个布尔值。我已经使用类似的格式来打开/关闭其他模块,并且它完美地工作。然而,出于某种原因,我不知道,布尔我试图分配变量从不切换。布尔没有在构造函数中设置

下面是创建布尔代码:

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; 
     } 
    } 
} 

同样,这种格式工作正常办理其他模块,但用于切换布尔从未分配,因为它被认为“财产”布尔“彩虹”。因此,布尔型'属性'正确切换,但变量'彩虹'保持为假。如果我错过了一些非常简单的东西,我很抱歉,我只是不明白为什么这不起作用。

没有堆栈跟踪,因为它不会产生任何错误。

+0

有一些很好的进一步阅读这里:HTTP://计算器。com/questions/40480/is-java-by-reference-or-pass-by-value – JETM

+0

是否使它成为“最终布尔彩虹”改变了什么? – vikingsteve

回答

2

问题是基元(例如布尔值)是通过值传递的,意味着当您将彩虹传递给ElementBoolean的构造函数时,Java会在堆栈中创建一个新的局部变量,但不会以初始的彩虹变量引用它。 什么,你真正需要的是一个可变(https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/mutable/package-summary.html
如果你不想使用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; 
    } 
} 
+0

谢谢大家的回应,我切换到MutableBoolean而不是布尔值,它解决了问题。 –

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,要更改变量propertyElementBoolean对象实例。你需要做的是(你尝试之前使用彩虹):

rainbow = yourElementBooleanInstance.getProperty()

Ofcourse,因为这是你需要做一个getProperty()方法返回property值并以某种方式保存的ElementBoolean实例private,因为你是不是现在这样做(你也可以让现场propertygetProperty()静态,然后做ElementBoolean.getProperty()

0

请参见下面的两个调用:

f(x) 
new ElementBoolean("Rainbow", rainbow) 

在java中传递的变量(xrainbow)将永远不会被另一个值覆盖。你通过传递值。字段property不是别名rainbow

这是故意设计的决定,因为你现在知道:

String s = "happy"; 
p(s); 
// s still will be "happy", not null or whatever 
相关问题