NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Javafx - metody formuláře k dispozici vývojáři

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
j.c.
Člen
Avatar
j.c.:9.7.2015 13:08

Nechal jsem se inspirovat
https://blogs.oracle.com/…s_in_javafx1

Angela je velice šikovná, má vícero formulářů a ty přepíná.
Mám to podobné. Ale potřebuji mezi formuláři předávat pár dat (a podle nich chodit do SQL, čili je tam víc a komplikované navazující logiky a dat).
A s tím mám problém.
Dám-li to do initialize tak se to předávat nemůže, neb to se udělá ještě dříve, než se kterýkoli z formulářů "objeví".
Obešel jsem to, mám timer u každého formuláře a ošetřeno, zda už běžel a natáhl to, co potřebuji.
Ale stydím se za to :D.

Kdysi jsem měl u formulářů v jiném jazyce metody Load,Init,Show,Ac­tivate a s tím jsem vystačil. Najdu něco podobného u Javy FX?

 
Odpovědět
9.7.2015 13:08
Avatar
Odpovídá na j.c.
Petr Štechmüller:9.7.2015 14:12

Ahoj, používám stejný způsob načítání více formulářů. Co jsem pochopil, tak Ty potřebuješ předat data do formuláře až po jeho načtení. Já to řeším tak, že v metodě setScreen volám vlastní metodu actionAfterShow­Screen() kterou definuje interface ControlledScreen a implementuje ji každý kontroler. Tím mám zajištěno, že každý kontroler může reagovat na tuto metodu po svém. Jestli Ti to nebude jasný, tak přiložím i nějaké kódy...

Nahoru Odpovědět
9.7.2015 14:12
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
Odpovídá na Petr Štechmüller
j.c.:9.7.2015 15:05

Ahoj, prosím, kdybys mohl to částí kódu přiblížit, pomohlo by mi to.
Není mi jasné, jak actionAfterShow­Screen() pozdržet.
Cokoli přidám do setScreenParent proběhne předčasně.
Interface zatím vypadá takto:

public interface ControlledScreen {
public void setScreenParen­t(ScreensContro­ller screenPage);
// sem přidat actionAfterShow­Screen() ??

}

 
Nahoru Odpovědět
9.7.2015 15:05
Avatar
Odpovídá na j.c.
Petr Štechmüller:9.7.2015 15:24

Bude to trošku těžší. Potřebuješ si uchovávat v HashMapě jak načtený nody, tak reference na kontrolery. Nevím jak moc jsi ten kód studoval.

Metodu přidáváš správně do interfacu.

1. Jak jsem již řekl, v HashMapě musíš uchovávat referenci na načtený nod, tak referenci na kontroler. To se dá zařídit tak, že si udělaš nějakou malou třídu třeba A, která bude mít následující složení:

final class A{
    public final Node node;
    public final IControlledScreen controlledScreen;

    public A(Node node, ControlledScreen controlledScreen) {
        this.node = node;
        this.controlledScreen = controlledScreen;
    }
}

Dále upravíš typ HashMapy na následující:

private final HashMap<String, A> screens = new HashMap<>();

V metodě loadScreen voláš po každém načtení metodu addScreen, která přidává zatím jenom Nody do tý HashMapy. Upravíš metodu addScreen následujícím způsobem:

public void addScreen(String name, Node screen, ControlledScreen controller) {
        screens.put(name, new A(screen, controller));
    }

Dále upravíš volání metody addScreen takto:

addScreen(name, loadScreen, screen);

Tím máme zajištěno, že v HashMapě bude reference jak na Node tak na jeho kontroler.

Nyní se můžeme dostat k samotné metode setScreen:
Hned na začátek metody doporučuji si vytáhnout z mapy správnou referenci takto:

final A a = screens.get(name);

Nakonec upravíme řádek

getChildren().add(0, screens.get(name));

na

getChildren().add(0, a.node);

Konečně se dostaneme k zavolání té metody actionAfterShow­Screen tím, že pod výše uvedený řádek napíšeš toto:

a.controller.actionAfterShowScreen()

Vím, je toho opravdu hodně, snad tě to neodradí. Kdyby jsi tomu stále nerozuměl, tak tě odkážu na můj git, kde mám celou tuhle featůru napsanou a česky okomentovanou.
https://github.com/…troller.java

Kdyby cokoliv nebylo jasný, určitě se ozvi.

Editováno 9.7.2015 15:24
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
9.7.2015 15:24
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
j.c.
Člen
Avatar
j.c.:10.7.2015 9:41

Po prvním nahlédnutí jsem si na to vyhradil víkend. Ale už mi to chodí. Tedy, zatím to píše do logu, že proběhla metoda actionAfterShow­Screen :).

Děkuji mnohokráte, klaním se a obdivuji tě, Velký Guru! :)

 
Nahoru Odpovědět
10.7.2015 9:41
Avatar
Odpovídá na j.c.
Petr Štechmüller:10.7.2015 9:45

Jsem rad, že Ti to pomohlo. Už jsem se bál, že je ten kód moc složitý a nepochopitelný.

Nahoru Odpovědět
10.7.2015 9:45
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.