2016-09-16 8 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; 
     } 
    } 
} 

繰り返しますが、このフォーマットは、他のモジュールを処理するための細かい動作しますが、ブール値を切り替えるためにそれをすることになっているようブール「虹」から「プロパティ」を割り当てされることはありません。したがって、ブール値「プロパティ」は正しく切り替えられますが、変数「レインボー」はfalseのままです。私は非常にシンプルな何かを逃している場合は申し訳ありません、私はちょうどこれが動作していない理由を理解できません。

エラーが発生しないため、スタックトレースはありません。

+0

:あなたが今知っているよう

これ

は、意図的な設計上の決定でした。com/questions/40480/is-java-pass-by-value – JETM

+0

「最終ブール虹」の変更は何ですか? – vikingsteve

答えて

2

問題は、プリミティブ(ブール値など)が値渡しされるということです。つまり、RainbowをElementBooleanのコンストラクタに渡すと、Javaは初期のレインボー変数では参照されないスタック内に新しいローカル変数を作成します。 あなたが自分で簡単に実装できるApacheのライブラリを使用したくない場合はあなたが実際に必要とする変更可能な(https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/mutable/package-summary.html
です:

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(); 

ポイントはあなたが変数propertyElementBooleanオブジェクトのインスタンスを変更している、変数rainbowを変更していないです。 (あなたは虹を使用しようとする前に)何をする必要がある:

rainbow = yourElementBooleanInstance.getProperty()

勿論、あなたがいるので、それは、あなたがproperty値を返すgetProperty()方法を作成し、何とかElementBooleanのインスタンスを保存する必要がprivateだから今、この権利を行っていない(あなたはまた、フィールドpropertygetProperty()は、静的行い、その後ElementBoolean.getProperty()を行うことができます

0

を以下の二つの呼び出しを参照してください:。

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

渡された変数(xおよびrainbow)は、Javaでは決して別の値で上書きされません。あなたはいつも値渡しです。フィールドpropertyは、エイリアスrainbowではありません。ます。http:// stackoverflowのここにいくつかの良い、さらに読書があります

String s = "happy"; 
p(s); 
// s still will be "happy", not null or whatever 
関連する問題