2016-09-16 41 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 
相關問題