1

Java の Swing を使用すると、目的のレイアウトを実現するために、要素を他の要素でラップする必要があることがよくあります。ただし、これらのパネルの要素は、たとえばフォーム送信時にスーパーパネル (ビューとも呼ばれます) からアクセスできる必要があります。

次の (簡略化された) 例を考えてみましょう。

class AddUserView extends JPanel {

   private JPanel elementWrapper = new JPanel();
   private JPanel buttonWrapper = new JPanel();

   private JTextField userNameField = new JTextField();
   private JButton submitButton = new JButton("Submit");

   public AddUserView() {

      // .. add elements to the wrappers
      elementWrapper.add(userNameField);
      buttonWrapper.add(submitButton);

      // .. add listeners etc

      // Add the wrappers to the view
      add(elementWrapper);
      add(buttonWrapper);

   }

}

viewこれは明らかに機能しますが、ラッパーの代わりにすべての要素を所有しているため、これは醜い解決策であると私は信じています。さらに、すべて (ie)GridBagConstraintsをビューに配置する必要があります。

もちろん、解決策の 1 つは、すべての要素を適切なラッパー クラスに配置し、それをpublic+finalにするか、膨大な量を作成することですgetters & setters

しかし、これを達成するためのもっときれいなOOPの方法があると確信していますか?

4

1 に答える 1

2

まあ、私はここに銀の弾丸の解決策があるとは思わない。

Swingを使用していたときは、次の点に注意してください。-カプセル化を使用します。パネルを再利用可能なコンポーネントとして扱います。-データレイヤーをビューから可能な限り切り離します。

質問に適用すると、これは次のことを意味する場合があります。-AppUserViewパネルが認識しているのは、elementWrapperとbuttonWrapperの2つのラッパーだけです。これらは「ブラックボックス」であり、AppUserViewで「そのまま」使用できる再利用可能なコンポーネントです。各「ラッパー」には、ボタン/テキストフィールド/必要なものすべてに関する参照があります。データモデルはこれらのビューから完全に分離する必要があります。対話はイベントによってのみ実行する必要があります。モデルがいくつかのイベントを発生させる必要があると判断した場合、関連するビューをそのようなイベントのリスナーとして登録し、それぞれ反応する必要があります。

お役に立てれば

于 2013-01-13T18:45:33.923 に答える