Przekazanie stanu obiektu z jednej klasy do drugiej.

Przekazanie stanu obiektu z jednej klasy do drugiej.
SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:9
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.

Kopiuj
 
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)

Kopiuj

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.

Kopiuj
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
Zobacz pozostałe 3 komentarze
GA
skoro miałeś dwa mainy to ja nawet nie będę się zastanawiał co mogło być nie tak :)
bogdans
!@soncrash, wstawiaj kod w znaczniki <code=java</code>
bogdans
@garai, a co jest złego w dwóch metodach main?
GA
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 :)
GA
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 5 lat
0
Kopiuj
public SimpleFrame() {
      //ustawienia ramki
 
      actionPerformed -> t.start();
   }

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

SO
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:9
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

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:

Kopiuj
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
SO
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ę
bogdans
@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[])
GA
@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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.