2017-06-05 7 views
0

私が作業しているプロジェクトのゲージを取得するためにMedusaFXライブラリを使用しています。私はすべてを実行するためにJavaFXアプリケーションを使用しており、レイアウトを作成するためにFXMLファイルを作成するためにScene Builderを使用しています。私が観察したことは、もし私がそうするなら、それは、gauge1変数が正しい値のセットを得ることです。配列内のMedusaFX要素は、配列を編集しても画面を更新しません。

@FXML private Gauge gauge1 = new Gauge(); 
    gauge1.setValue(30); 

しかし、私がしなければ

@FXML private Gauge gauge1 = new Gauge(); 
    ArrayList<Gauge> list = new ArrayList<>(); 
    list.add(gauge1); 
    list.get(0).setValue(30); 

    System.out.println(gauge1); 
    System.out.println(list.get(0)); 

私の出力は

{"title":"Temperature","subTitle":"Temperature","unit":"°F","value":0.0,"minValue":0.0,"maxValue":175.0,"threshold":60.0,"minMeasuredValue":0.0,"maxMeasuredValue":0.0} 
{"title":"","subTitle":"","unit":"","value":30.0,"minValue":0.0,"maxValue":100.0,"threshold":100.0,"minMeasuredValue":30.0,"maxMeasuredValue":30.0} 

ArrayListのは、それがその中に持っているものを修正するのではなく、ゲージの新しいインスタンスを作成し、同じように見えるように、この出力は、私を混乱です。助言がありますか?

答えて

0

FXMLLoader.load()でfxmlファイルをロードすると、ファイルが解析され、見つかったすべてのノードのインスタンスが作成されます。

だから、あなたはあなたのコントローラにこれを追加するとき、fx:id="gauge1"であなたのFXMLファイル内Gaugeノードが存在すると仮定:

@FXML private Gauge gauge1; 

FXMLLoaderがあなたのためにインスタンスを作成します。あなたは、その後のような値を設定することができます。

public void initialize() { 
    gauge1.setValue(30); 
} 

しかし、あなたが行うとき:最初の1は、反射によって作成され、ちょうどベース:何が起こっているのか

@FXML private Gauge gauge1 = new Gauge(); 

は、あなたが実際に2つ目のインスタンスを作成しているということですfx:idラベルに追加され、FXMLLoaderによってシーングラフに追加されますが、作成した2番目のグラフはシーングラフに追加されません。

その後、変更している実際のインスタンスがわかりません。あなたがプリントアウトをするとき、恐らくあなたはシーングラフに追加されていないリストの両方のオブジェクトにアクセスしているでしょう。

だから、解決策は簡単です:2番目のインスタンスを作成し、ちょうどこれを使用しないでください:

@FXML private Gauge gauge1; 
関連する問題