電子書籍の厳選無料作品が豊富!

swingで画像を読み込み、編集して保存する簡単なお絵かきソフトを作っています。
恥ずかしながら、とても初歩的なところ(設計段階)でつまづいてしまったので質問させていただきます。

構造としては、大本のJFrameがあり、左側にはコントローラーとして動作するJPanel、右側にはキャンバスとして動作するJPanelを配置します。
コントローラーJPanel内にはさらに線を引くボタン、円を描くボタン、スタンプを配置するボタンなどがあります。
キャンバスJPanel内には画像を読み込むためのJLabel、描画された線、円、スタンプなどが配置される描画JPanelなどがあります。

いま、コントローラーに「配置されている全スタンプの大きさ2倍」のボタンを作ろうと思っています(このボタンの必要性については考えないでください(笑))。
スタンプのクラスにはすでに自身の大きさを2倍にするメソッドを用意しました。
あとはボタンがクリックされたときに全スタンプに対して大きさ2倍メソッドを呼べばこれが実装できると思いまいた。
しかし、そのメソッドを呼ぶためには、コントローラーからスタンプへアクセスする必要がありますよね。
スタンプのインスタンス群を格納している配列は描画JPanelが持っているため、そこまで到達しなければなりません。

つまり、大きさ2倍ボタン→コントローラーJPanel→メインJFrame→キャンバスJPanel→描画JPanelと辿らなければスタンプへアクセスできません。
各インスタンスに親と子への参照を持たせて、getChild()とかgetParent()のようなメソッドで参照を得るようにすれば辿れなくはないと思うのですが
getParent().getParent().getChild().getChild().スタンプ群配列 のような感じになって明らかに変ですし、これがプログラム設計上好ましくないであろうことはわかります。

このようなことをしなくてもうまくいく方法はないものでしょうか。
どうかお力添えください。よろしくお願いします。

A 回答 (2件)

実装はいろいろ考えられるからなぁ....



理屈だけからいえば, 描画パネルを observer とする observer/observable パターンを使ってもいいわけだし.
    • good
    • 0

なんで「大きさ2倍ボタン→コントローラーJPanel→メインJFrame→キャンバスJPanel→描画JPanelと辿らなければ」ならないのかさっぱりわからん....



例えばだけど, 「大きさ2倍ボタン」のハンドラを「メインJFrame」の内部クラスにしておけば簡単にならないかな.
    • good
    • 0
この回答へのお礼

なるほど。
イベントハンドラは呼び出し元のオブジェクトのクラスに書かなければならないものだと思いこんでいました。
確かにメインJFrameの内部クラスとしておけば、入れ子を遡る必要はなくなりますね。
ありがとうございます。

メインJFrame→キャンバスJPanel→描画JPanel と辿る必要はありますが、これは仕方のないものなのでしょうか。
また、オブジェクト指向設計の観点からはこのような実装が最善のものなのでしょうか。

お礼日時:2017/05/21 04:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!