Problem ze wzorcem "obserwator"

0

Witam!
Mam 2 klasy A i B. B agreguje klasę A. Muszę wywołać metodę z klasy B - showProgress(int progress); z poziomu klasy A przekazując wartość parametru "progress" z klasy A. Stosowałem już wielokrotnie obserwatorów, ale pomiędzy dwoma klasami dzieczącymi po JPanelu, a tutaj nie mam pojęcia jak to napisać. Bardzo proszę o konkretne rozwiązanie, ponieważ przeczytałem chyba większąść możliwych artykułów w temacie i niestety nie potrafie zbudować na ich podstawie rozwiązania.

public class A{

      int progress;

      public int getProgress()
      {return progress;}

}

public class B extends JPanel{

      public A a;
      public int progress;

      public void showProgress(int progress){
         this.progress = progress;
         repaint();
      }

}
0

Nie do końca rozumiem co właściwie chcesz zrobić. Jeżeli chcesz przekazać wartośc progress z "a", to w metodzie z klasy B używasz "a.getProgress();"
Jeżeli jednak chciałbyś przenieść te dane używając metody z klasy A, to musiałbyś zrobić coś takiego:

public class A{
      private int progress;
      public int getProgress() {return progress;}

      private B b;
      public A(B callback) {b = callback;} //referencja do obiektu klasy, którą pomanipulujesz
      public void showProgress(int progress) { b.showProgress(this.progress);}
}

public class B extends JPanel{
      // jakoś musisz stworzyć obiekt, do którego referencja będzie w a
      public A a = new A(this); //można to wrzucić do konstruktora B lub dowolnej jej metody
      public int progress;

      public void showProgress(int progress){
         this.progress = progress;
         repaint();
      }

}

Tyle, że nie jest to najszczęśliwsza konstrukcja bo klasa A jest ściśle zależna od klasy B. Najczęściej prywatne pole b klasy A jest nie typu bezpośrednio B, a typu interfejsu, który jest realizowany przez B (wtedy interfejs taki musiałby mieć metodę setProgress, którą B implementuje). Jeszcze innym sposobem jest wpakowanie klasy A do B jako klasy wewnętrznej - bo wtedy klasa A ma dostęp do wszystkich pól klasy B obiektu w którym zostałby stworzony obiekt klasy A (poprzez B.this - który jest zresztą domyślny w klasie wewnętrznej B). W tym wypadku wyglądałoby to tak:

public class B extends JPanel{
      public class A{
            private int progress;
            public int getProgress() {return progress;}

            public void showProgress(int progress) { B.this.showProgress(this.progress);}
// lub prostszy wariant 2, gdzie robimy bezpośredni dostęp do pola prywatnego klasy zawierającej:
//          public void showProgress(int progress) { B.this.progress = /*this.*/progress;}
      }

      // jakoś musisz stworzyć obiekt, do którego referencja będzie w a
      public A a = new A(); //konstruktor domyślny
      public int progress;

      public void showProgress(int progress){
         this.progress = progress;
         repaint();
      }
}

Mam nadzieję, że to Ci coś rozjaśni, albo załapiesz, że chciałeś coś zupełnie innego. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1