Как я могу разделить методы между двумя разными окнами Swing? - PullRequest
3 голосов
/ 28 января 2012

У меня есть приложение Swing, в котором у меня есть несколько окон с разными целями, но у них всех есть две общие черты:

  • Они используют определенный объект, связанный с бизнес-логикой
  • Они должны обновить некоторые виджеты с помощью материала конкретного объекта

Итак, чтобы избежать избыточности кода, я хотел поделиться некоторыми из этих подпрограмм.Может быть, пример может быть более понятным:

public class WindowA {
     private JLabel labelA;
     // ...
     private void updateLabelInACertainManner() {
          labelA.setText(this.specificObject.getText());
     }
}

public class WindowB {
     private JLabel labelB;
     // ...
     private void updateLabelInACertainManner() {
          labelA.setText(this.specificObject.getText());
     }
}

Как я могу поделиться updateLabelInACertainManner(), зная, что specificObject ссылается на один и тот же объект в обоих классах?

Я думал о наследовании обоихWindowA и WindowB из WindowRoot, который содержит метод, но как это сделать, если labelA и labelB не являются одним и тем же объектом, необязательно созданным одинаковым образом?

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Я думаю, вы должны прочитать об этом подходе или об этом подходе .

1 голос
/ 28 января 2012

Вы можете передать метку, текст которой должен быть изменен, в качестве параметра методу в суперклассе:

public class SuperWindow {
    protected void updateLabel(JLabel label) {
       label.setText("foo");
    }
}

public class WindowA extends SuperWindow {
    private JLabel labelA;
    //...

    private void somethingHappened() {
      updateLabel(labelA);
    }
}

Или вы можете написать геттер для метки в определенных подклассах:

public class SuperWindow {
   protected abstract JLabel getLabel();

   protected void updateLabel() {
     getLabel().setText("foo");
   }
}

public class WindowA extends SuperWindow {
   private JLabel labelA;
   //...

   @Override
   protected JLabel getLabel() {
      return labelA;
   }

   private void somethingHappened() {
      updateLabel();
   }
}

И то же самое для specificObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...