私はカスタムのスイング コンポーネント (まったく新しいものですが、JTree または JList を考えてください) を作成しています。一貫性を保つために、JTree、JTable、JList などの一般的な設計に従おうとしています (また、さまざまな貧弱なサードパーティ コンポーネントが分離可能なモデルやレンダラーのアプローチを放棄しているのを見てきました)。
したがって、ノード、コンポーネント自体、およびレンダラーでいっぱいのモデルがあります。ある時点で、ノードをテキストに変換し、レンダラーで表示する必要があります。これを行う最善の方法がわかりません:
- ノード自体を (オブジェクトとして) レンダラーに渡し、レンダラーに表示方法を決定させます。
- これが JList のやり方です。
- テキストを変更するためだけに、カスタマイズされたレンダラーが必要です。
- ノードの表示方法を非常に柔軟に設定できます (テキストである必要さえありません)。
- ノード自体を (オブジェクトとして) レンダラーに渡しますが、コンポーネント クラスには convertValueToText() メソッドがあります。
- これが JTree のやり方です。
- レンダラーは以前と同じように柔軟にすることができます -この方法を使用する必要はありません。
- テキスト変換を変更するには、コンポーネントをオーバーライドする必要があります。
- 上記と同様ですが、convertValueTotext() をモデルにデリゲートします。
- これが JXTable のやり方です。
- モデルはおそらくこのメソッドに最適な場所であり、そこでオーバーライドする方が簡単です。
テキストを変更するためだけにレンダラーをカスタマイズする必要はありませんが、モデルに表示される文字列を表示する以上のことを行うためにレンダラーをカスタマイズできるようにしたいと考えています (そうでなければ、レンダラーを気にする必要があります)。JXTable がリフレクションを使用してモデル内の convertValueToText() を検索するという事実が本当に気に入りません。これは悪い魔法の匂いがします。
Swing のこの見過ごされがちな部分に光を当てることができる人はいますか?
解決
私がやったことはこれでした:
- 指定されたノードの文字列を返すメソッドをモデルに追加します。重要なのは、レンダラーが何をすべきかを知っている必要があること、または単に有用なものを提供できないことを示すために、これを null にすることができることです。
- コンポーネントには同じメソッドがあり、呼び出しをモデルに渡します。これは、ビュー モデルの分離にとって重要です。レンダラーはこのメソッドを呼び出すため、モデルと直接対話しません。
- デフォルトのレンダラーは上記のメソッドを呼び出し、それが null でない場合はそれを使用します。
これにより、開発者は、表示された値をオーバーライドしたい場合に選択肢が残ります。デフォルトのレンダラーがこのテキストを表示することを認識して、null 以外の戻り値でメソッドをオーバーライドします。- 実際のノード オブジェクトが渡されるカスタム レンダラーを提供して、必要に応じて「賢い」ことを実行できるようにします。
私はとても満足しています - それは正しく「感じ」、機能し、使いやすいです。
あなたの視点をありがとう!