質問: new Rectangle(100,100); rect.setFill(Color.BLUE); } } ```
回答: ### 通知の仕組み java.util.Observableが自分の変化を監視者へ通知する際には「変わった」とマークしないと通知されないみたいです。 `notifyObservers("string");` だけでは何もおこらずその前に `setChanged();` を呼び出す必要があるのですね。 こうなっている理由はObservableのデザインパターンとは多分直接関係なくて「複雑な状態を持つような一般的なObservableを設計する際に変化をどうやって手際よく通知するか」に関することだと思います。 Observableの処理の中で あっちの処理やって こっちの処理やって そっちの処理やって 最後に「変化があれば通知する」 というような作りが便利ということなのでしょう。あっちこっちの処理のどこかで「状態変わった」ということが認識できたらsetChanged()とやっておくわけです。そうして処理の元締めへ戻った時「もしどこかで変化が起きていたら通知」とやるわけですね。内部状態の一つ一つが変化するごとに通知していたのでは効率的な問題、あるいは「状態変化が中途半端な状態で監視者がObservableの状態を調べ始めること」が都合が悪いためにこうなっていると思います。 ちなみにMrObserver#updateはせっかく呼び出されても期待する画面の変更は起きません。なぜなら「新たにRectangleを生成しているだけ」であってそれをJavaFXのシーングラフへ追加していないからです。 考え方を変えてください。既にシーングラフにRectangleのインスタンスがくっついている状態でupdateが呼ばれるのですからそのRectangleインスタンスの状態を変更すればよいのです。 ``` rect.setWidth(100); rect.setHeight(100); rect.setFill(Color.BLUE); ``` 「え・・・WidthやHeightを変えるだけで画面が変わるの?」と思われるかも知れません。JavaFXのNode(画面上に表示されている全てのもの)が持つwidth, height, fillといった変更可能プロパティーはjavafx.beans.Observableという監視可能なオブジェクトでして、その値を変更するとそれが自動的に画面に反映される仕組みになっているのです。これはJavaFXに限ったことではなく大抵のGUIシステムでそんな感じだと思います。Androidしかり、Unityしかり、Windows Formアプリしかりです。