布尔值没有在构造函数中设置

时间:2016-09-16 12:36:39

标签: java

我正在尝试创建一个按钮,在按下按钮时打开/关闭布尔值。我已经使用类似的格式打开/关闭其他模块,它完美地工作。但是,由于某些原因我不知道,我试图将变量分配给永远不会切换的布尔值。

以下是创建布尔值的代码:

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。如果我遗漏了一些非常简单的东西,我很抱歉,我无法理解为什么这不起作用。

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

3 个答案:

答案 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的实例,因为你现在没有这样做(您也可以将字段propertygetProperty()设为静态,然后执行ElementBoolean.getProperty()

答案 2 :(得分: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