Przekazanie stanu obiektu z jednej klasy do drugiej.

Odpowiedz Nowy wątek
2015-01-13 20:54
0

Cześć,

w moim programie jest ramka JFrame nazwijmy ją SettingFrame, ponieważ służy do zmian ustawień. W ramce tej utworzony jest guzik. Guzik ten wywołuje ważną funkcję - start(), która otwiera okno przeglądarki.

funkcja jest bardzo prosta i znajduje się w klasie Test.


public class Test {

private WebDriver driver;

   public void start() {
       driver = new FirefoxDriver();
   }

   public void select() {
       driver.get("jakis url");
   }

}

W klasie SettingFrame tworzony jest obiekt typu Test w następujący sposób: (żeby zaoszczędzić wam czasu napiszę część klasy pseudokodem)


public class SettingFrame extends JFrame {

   private Test t = new Test();

   public SettingFrame() {
      //ustawienia ramki

      actionPerformed -> t.start();
   }

    public Test getTest() { 
       return t;
    }
}

Teraz przejdźmy do 3 ostatniej ramki. To ramka głownego okna programu - MainFrame. W tej ramce chcemy wywołać inną metodę z klasy Test, a mianowicie select(), jednakże ta metoda zwróci NullPointerException, jeśli metoda start(), nie zostanie wcześniej wywołana.

public class MainFrame extends JFrame {

   private Test t;
   SettingFrame ssFrame = new SettingFrame();

   public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
             try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
               } catch (Exception e) {
                e.printStackTrace();
               }
              }
        });
    }
   }

   public MainFrame() {
     //ustawienia ramki

      actionPerformed {
         t = ssFrame.getTest();
         t.select(admin);
     }
   }

}

Jak widzicie ustawiłem mój obiekt "t" w MainFrame na obiekt z SettingFrame. Jednakże dostaję wyjątek NullPointerException jakby funkcja start() w ogóle się nie wywołała.

Pozdrawiam was serdcznie i dziękuje z góry za pomoc.

Edycja:

Jeszcze chciałbym dodać, że użycie słowa kluczowego static przy private Test t = new Test(); w klasie SettingFrame, rozwiązuje ten problem, jednakże wolałbym to zrobić bez zmiennej statycznej.

edytowany 5x, ostatnio: bogdans, 2015-01-14 07:22
Pokaż pozostałe 3 komentarze
skoro miałeś dwa mainy to ja nawet nie będę się zastanawiał co mogło być nie tak :) - garai 2015-01-13 22:12
!@soncrash, wstawiaj kod w znaczniki <code=java</code> - bogdans 2015-01-14 07:25
@garai, a co jest złego w dwóch metodach main? - bogdans 2015-01-14 07:25
teoretycznie nic, ale zaciemnia kod, a jeżeli ktoś nieświadomie wstawił dwa mainy to jakich jeszcze "niespodzianek" oczekiwać w kodzie a co dopiero w pseudokodzie :) - garai 2015-01-14 08:55

Pozostało 580 znaków

2015-01-13 21:08
0
public SimpleFrame() {
      //ustawienia ramki

      actionPerformed -> t.start();
   }

zgaduję, że tu zadeklarowałeś listenera ale go nie wywołałeś przyciskiem

Pozostało 580 znaków

2015-01-13 21:11
0

Przepraszam za błędy, skracałem kod na szybko, listener jest anonimową klasa wewnętrzną, jednak nie chciałem tego pisać żeby nie powiększac kodu, działa prawidłowo, bo po wciśnięciu przycisku funkcja start się wywołuje

Pozostało 580 znaków

2015-01-13 21:52
Wybitny Orzeł
0

Proponowalbym Ci wyniesienie Frame'a do nowej klasy i inicjalizacje jej z klasy ktora ma w sobie main() calej aplikacji. Kazdy 'frame' swingowy odpalany jest w w roznych watkach i to moze powodowac problemy. Sugeruje takie rozwiazanie:

public class TestFrame extends JFrame {
   private Test t;
   private SettingFrame ssFrame = new SettingFrame();

   public TestFrame() {
           // ustawienia ramki etc.
   }

   // zakladam ze to podpinasz pod button
   public void actionPerformed() { .... }
}

public class Application {
 public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
        public void run() {
               new TestFrame().setVisible(true);
        }
}
}

powinno zadzialac.
Sorki za formatowanie

edytowany 1x, ostatnio: bogdans, 2016-12-13 18:26
Dzięki za odpowiedź, okazało się że miałem dwie metody main w kodzie :D wezmę Twoją podpowiedź pod uwagę co do przeniesienia metody main poza ramkę - soncrash 2015-01-13 21:56
@soncrash, nadal szukaj błędu, dwie metody main w niczym nie przeszkadzają: jeśli mają taką samą sygnaturę, to kodu nie skompilujesz, jeśli sygnatury są różne, to uruchomi się ta metoda public static void main(String[]) - bogdans 2015-01-14 07:28
@bogdans tu nie chodziło o przeciążenie maina, @soncrash miał dwa "standardowe" mainy w dwóch różnych klasach, pewnie odpalał obydwa i myślał, że SimpleFrame z maina, to ten sam frame co zawiera klasa MainFrame - garai 2015-01-14 10:12

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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