JavaFx zdarzenia.

0

Witajcie

W moim kodzie posiadam 4 widoki. Jeden glówny (Main) drugi stały (gdzie podczas całego programu jest on wyświetlany) oraz trzeci i czwarty który są zamienne jeżeli kliknie sie na przycisk.

Mam teraz pytanie. Jak stworzyć zdazenia żeby po kliknieciu na ten stały widok, aktualizował sie widok trzeci.

W celu lepszego zaobrazowania

mój ekran dzieli sie na dwie cześci, na mape oraz na dwa formularze, które zmieniaja sie po kliknieciu na przycisk. Klikajac na mape jeżeli pierwszy formularz jest aktywny (wczytany) to wyświetlą mi sie na nim współrzedne. Da rade zrobić coś takiego? Proszę pomóżcie bo siedze nad tym juz od tygodnia

0

Ja bym to zrobił jakimś ActionListener'em. Tworzysz interface np. SomethingListener z abstrakcyjną metodą np. onClickedButton. Implementujesz go w klasie która przechowuje referencje do wszystkich widoków, żeby coś tam robił na innym widoku, następnie w widoku na którym coś jak klikniesz to coś się bedzie działo na innym, rzucasz jako pole tego SomethingListener, dodajesz set'era i ustawiasz set'erem zaraz po stworzeniu widoku tego SomethingListenera, jako "this" (Czyli klasa która zaimplementowała SomethingListener), dzięki temu możesz niejako "cofnąć się".

0

Mógłbyś to zaobrazować bardziej kodowo? powiedzmy ze mam mapę (widok Map i kontroler Map) i dwa formularze (form1, form2). Referencje przechowuje w klasie Main. Jeżeli klikne na mapę a aktualnie naekranie jest form1. to wyświetli mi sie w jakimś polu tekstowym współrzedne:)

Nie chodzi mi oczywiście o napisanie kodu ale tak bardziej obrazowo :)

0

Mam nadzieję, że chodzi nam o to samo :)

Listener interface

public interface SomeListener {
    public void doSomething();
}

Pierwszy kontroler

public class FirstController {
    private SomeListener someListener;
 
    // metoda wykontywana po kliknieciu np. przycisku
    public void onClickedButton() {
        someListener.doSomething();    
    }

    public void setSomeListener(SomeListener someListener) {
        this.someListener = someListener;
    }
}

Drugi Kontroler

public class SecondController() {
   
    public void changeSomething() {
        System.out.println("Print log of change");
    }
}

No i klasa która wszystko koordynuje

public class Application implements SomeListener {
    
    private FirstController firstController;
    private SecondController secondController

    public Application() {
        firstController = new FirstController();
        firstController.setSomeListener(this);
        secondController = new SecondController();
    }

    // Sedno całego "konceptu", wykonujac metode w 
    // firstController'ze zmieniasz coś w secondController
    @Override
    public void doSomething() {
        secondController.changeSomething();
    }

}

Pisane na szybko powinno być ale powinno być OK. :)

0

stokrotne dzięki :) już przechodze do implementacji i sprawdzę jak to wszystko działa :)

0

Dzięki wielkie :) super wszystko działa, sama bym na to nie wpadła :) także stokrotne dzięki :)

0

Jest tylko jeden mały problem.

Faktycznie funkcje działają. Ale są wykonywane zawsze, nawet jeżeli ekran nie jest "wczytany" czy masz pomysł jak to obejść?

0

Po prostu sprawdzasz czy jest coś wczytane. Możesz po prostu zrobić boolean'a typu "isLoaded" czy coś takiego i przy wczytywaniu zeminiasz to na true, przy chowaniu na false, a w funkcji którą implementujesz dajesz if'a i działa wszystko pięknie.

0

Kolejnym problemem jest to że jak wyczytuja sie pliki FXML to z automatu jest tworzona referencja na Controller. dodając new Controller nie mamy referencji na elementy, wszystko jest znulowane

0

Dlatego musisz pobrać ten kontroler przez widok: http://stackoverflow.com/questions/25828561/javafx-how-to-get-fxml-controller . Generalnie ja też zaczynam teraz w JavaFX i polecam Ci http://afterburner.adam-bien.com/ .Super mały ale i wydajny framework :)

0

Dziękuje bardzo bardzo za pomoc :) Wszystko działa :)

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