2017-11-09 14 views
2

の詳細を示しパネルを更新する方法、Person参照を保持し、次のようにそのフィールドの値を表示する、のはdetailsPanelそれを呼びましょう。 (GridBagLayoutを使用して正しく整列)を使用して、それぞれを表示します(fieldNamefieldValue)。私は表示するフィールドがたくさんある。私はパネルを持っているオブジェクト

問題を表示するパネルは、常に表示する必要があります。すなわち、JDialogというモードでは表示されないため、パネル作成時にPersonオブジェクトフィールドを読み込むだけでパネルを作成できます。

ユーザーがPersonリスト内の別の行を選択すると、パネルが常に表示され、そのPerson参照が変更されます。

detailsPanel.setPerson (aPerson); 

は今、私はすべてのフィールドを更新する必要がありますどのように思ったんだけど:これは私は、のようなものを、その状態を更新するメソッドを呼び出します。値を表示するすべてのJLabelsへの参照を保持し、パネルを更新するときにそれぞれにsetText(value)を使用するか、適切なフィールド値を返すようにすべてのラベルに対してgetText()メソッドをオーバーライドする方がよいでしょうか。私はパネルを再描画するメソッドを更新し、getterメソッドが異なるPersonオブジェクトで使用されると、テキストは自動的に変更されますか?

ご迷惑をおかけして申し訳ございません。

答えて

2

これは通常はほとんど決して呼ばれない(これは、他の計算で物事が呼び出される頻度に比べて)あなたは効率について全く心配する必要はありません。最も洗練されたソリューションだと思います。すぐに私の心に来る3つのオプションがあります。彼らは、エレガントで再利用可能に迅速かつ静的から注文されています

  1. クイックや汚れ:あなたのコンストラクタを作成し、すべてが素敵に見えるように。その後、コンストラクタから別のinit()メソッドに移動し、エンティティが変更されるたびにremoveAll();と、次にinit()を再度呼び出します。

  2. 提案したように、すべてのラベルへの参照を保持し、すべてのパネルを更新するにはメソッドを使用してください。次に、コンストラクタでこのメソッドを呼び出します(おそらく最も一般的な解決策です)。

  3. 提案したように、独自の拡張子JLabelを作成します。この新しいクラスは、変更の際に呼び出されるupdate()メソッドを持つか、関連する変更が通知されるように独自のリスナーを設定する必要があります。

    すべての種類のオブジェクトを表示するはずの1つのパネルを作成する場合は、そのオブジェクトにDisplayableというインターフェイスを実装して、すべての値にアクセスしたり、各値のリスナーにアクセスすることができます。 Displayableインターフェイスの代わりに、リフレクションを使用して注釈を使用して、パネルがその値を表示できるようにすることができます。

最も洗練された解決策は、 - 一部の人々があなたに伝えるかもしれないことに反して - 必ずしも最善ではないことに注意してください。あなたは将来どのくらいのメンテナンスを期待していますか?アプリケーションの大きさはどれくらいですか?コードを他の人に渡しますか?あなたのソリューションがどれくらい「いいですか」をどのようにして決めるべきかを決めるためには、これらすべてを考慮する必要があります。

+1

あなたの詳細な回答をありがとう、おそらく私の現在のニーズでは、ソリューション番号2で十分ですが、いくつかの非常に興味深い事柄を指摘しました! – Ansharja