Przekazanie stanu obiektu z jednej klasy do drugiej.

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.

0
public SimpleFrame() {
      //ustawienia ramki
 
      actionPerformed -> t.start();
   }

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

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:

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

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