2009-06-04 1 views
2

特定の画面位置に画像を描画するGUI要素を使用する必要があります。 ユーザーがこの画像を選択すると、画像の周りに境界線が描かれます。 ここでは、ユーザーに特定の値を持つ写真を識別する別の枠線を追加します。GUI要素の図面を分割する

要素は、選択されていれば自分の内部状態を見て、次に自分自身を描画する方法を決定します。

graphic.drawImage(icon, x, y, null); 
if (selected) { 
    drawBorder(); 
} 

私はこの描画方法に他のものを追加するという考えは嫌いです。 私は、要素の動作を継承し、drawメソッドを上書きする新しいクラスを作成することを考えましたが、それは選択されたコード全体をすべての継承クラスに複製することを意味します。 サブクラスを作成せずにこの問題を解決するといいでしょうか?

答えて

1

これはデザインパターンでタグ付けされており、パターン指向のアプローチを探しているようだから、state patternをご覧ください。ウィキペディアのページの例では、GUIを描いている間も状態を維持することが言及されています。残念ながら、これは、サブクラスとオーバーライドされたメソッドを持つ別のクラスを作成する必要があることを意味します。

これは変更される可能性がありますか?私。現実的には、新しいビヘイビアを描画に追加すると思いますか(たとえば、ユーザーがダブルクリックしたり、異なるタイプの境界線を描画したり、ユーザーが右クリックしたり、境界線の色を変更した場合など)、それともこれですか?より多くの振る舞いが追加されるのを見ると、私は先に進み、より多くのオブジェクト指向のアプローチをとることが賢明だと思います。この2つのケースだけの場合は、else ifというステートメントを追加するといいでしょう。

+0

あなたは正しいと思います。これを2つまたは3つの異なるビヘイビアに対してのみサブクラス化することはオーバーヘッドであり、後で変更する場合は、より高度なアプローチに変更することができます。今のところ、if elseをスイッチに変更しようとしています。ブール値が列挙型に選択されているため、描画に使用する動作を指定する必要があります。 – Janusz

+0

これはかなり賢明な考えのようです。あまりにも扱いにくくなってしまうと、switch文を簡単にリファクタリングしてより高度なオブジェクト指向のアプローチを使用することができます。 –

0

あなたはif-elseに対して何を持っていますか?

描画機能でフラグをチェックするよりも、選択したアイテムにまったく新しいオブジェクトを作成するほうが意味がありません。

0

一つの可能​​性は、あなたのdrawBorder()メソッドは、パラメータを取ることができるようにすることです:

private void drawBorder(boolean isSelected, boolean hasSpecialValue); 

この方法は、描画するためにどの境界線の種類を判別することができます。