質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

解決済

JavaFXにおけるObserverパターンの実装方法

hilty8
hilty8

総合スコア0

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

1回答

0評価

0クリップ

1620閲覧

投稿2018/03/12 06:10

デザインパターンを勉強しています。
java.util.observer, java.util.observable を用いたObserverパターンを実装してみたのですが、期待通りに動いてくれません。

期待した動作

Subject = Boardクラス
Observer = MrObserverクラス
Boardクラスにあるボタンをクリックすると、MrObserverがそれを感知し、MrObserverが所有するRectangleの大きさと色が変わる、という動作を期待しています。

考えていること

Observerパターンは、以下の条件を満たせば機能すると考えています。抜け、漏れ、誤解などありましたら教えてくださると助かります。
1、Observer「MrObserver」は、implements Observer を実装
2、Subject「Board」は、Observableを継承
3、addObserverメソッドにより、Subjectは、Observerを把握
4、Subjectが何処かでnotifyObservers()を実行する
5、Observerのupdate()に処理してほしい内容を書く

Observerパターンについて、notifyObservers(), update()メソッドについて、以下の様に理解していますが、
その具体的なやり方がわかりません。
・SubjectがnotifyObservers()を実行すると、観察者側のupdate()メソッドが実行される
・notifyObservers()、update()のメソッドには引数を指定でき、そこでデータのやり取りが出来る

聞きたいこと

期待通りの結果にならない理由について、指定していただきたいと考えています。
宜しくお願い致します。

ソースコード

java

public class JavaFX12 extends Application{ @Override public void start(Stage primaryStage) { Board board = new Board(); MrObserver observer = new MrObserver(); board.addObserver(observer); GridPane grid = board.grid; GridPane grid2 = observer.grid; VBox vbox = new VBox(); vbox.getChildren().addAll(grid,grid2); StackPane root = new StackPane(); root.getChildren().add(vbox); Scene scene = new Scene(root, 300, 250); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }

java

public class Board extends Observable{ GridPane grid; public Board(){ grid = new GridPane(); Button btn = new Button(); btn.setOnAction((ActionEvent event) -> { notifyObservers("string"); }); grid.add(btn, 0, 1); } }

java

public class MrObserver implements Observer{ GridPane grid; Rectangle rect; public MrObserver(){ grid = new GridPane(); rect = new Rectangle(50,50); rect.setFill(Color.RED); grid.add(rect, 0, 0); } @Override public void update(Observable o, Object arg) { rect = new Rectangle(100,100); rect.setFill(Color.BLUE); } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。