Diskuze: Nové okno v JavaFX
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Tak snad nebudu říkat blbosti...
Když loaduješ .fxml soubor, tak se načte rozvržení okna z onoho souboru (v
tvém případě FXMLDocument2.fxml), a v něm je odkaz na třídu
Controlleru (FXMLDocument2Controller). Po vytvoření se v něm
zavolá metoda initialize(), která zajišťuje "přípravné práce"
po vytvoření základního dokumentu. Protože nemáš ve třídě
implementované rozhraní Initializable, tudíž tam ani nemáš onu
metodu, tak se ti okno nemůže ani načíst. Spíš doporučuji používat
předdefinované FXML soubory (v nabídce přidání souboru je možnost "Empty
FXML", po zaškrtnutí jedné z možností se ti vygeneruje i Controller),
jejichž okna budeš inicializovat z vnější třídy, jako to ty děláš zde
přes metodu (což jsem ani moc nepochopil, jestli to vůbec jde včetně
získání požadované instance Controlleru "obklikou"). I když já osobně
používám
Parent root = FXMLLoader.load(getClass().getResource("Okno.fxml"));
Takže se to dělá v initializable ? A jak to tedy bude vypadat ? Promin začínám v tom takže jsem trochu pomalejší, klidně mi sem pošli kód
Ahoj, kdyby jsi alespoň trošku pogooglil, tak vyřešíš problém hned. Nevím, jak Netbeans zobrazuje chyby, ale v IntelliJ byla chyba vypsaná jasně:
javafx.fxml.LoadException: Controller value already specified.
Po vyhledání této vyjímky na googlu mi hned na prvním odkazu vylezlo
řešení.
Řešení: Když ve druhém kontroleru definuješ kontroler pomocí metody:
fxmlLoader.setController(this);
tak nemůžeš mít tento kontroler definovanej ještě ve FXML dokumentu. Tedy v souboru
FXMLDocument2.fxml
musíš smazat toto:
fx:controller="zkouseniblbosti2.FXMLDocumentController2"
a vše bude fungovat správně.
To pocitac770 metoda initialize se implementuje pouze tehdy, když si usmyslíš, že chceš implementovat rozhraní Initializable a potřebuješ vykonat nějaké věci těsně po inicializaci okna. Toto rozhraní nehraje žádnou roli co se týče načítání okna.
Snad to pomohlo...
Super diky moc funguje A hele nejde to ještě nějak jednodušeji klidně ? Já jsem todle vyplodil ve své hlavě
Maximálně mně napadá si na to vytvořit nějakou statickou metodu v
pomocný třídě, kterou budeš volat vždy, když chceš vytvořit nový okno.
Nic jinyho mně nenapadá...
Btw, můžeš tu odpověď označit jako řešení tvého dotazu...
Jojo jasnačka já právě jenom jestli to nědelam blbě Díky moc za vyřešení mého problému
Neměl jsem zrovna po ruce IDE, a kouknul jsem se jen na zdroják, tak mě
nenapadla až tak zvláštní chyba jako toto
A s tím Initializable... Právě jsem myslel, že se nutně automaticky volá
při načtení... Tak alespoň zase o znalost víc, že to jde i bez toho
Jasný, zkus se podívat do zdrojaku javy, jak je to s tím initializable. Zjistís, že je tam nějaká podminka typu:
if(controller instanceof Initializable)
volej nad kontrolerem metodu initialize
Zobrazeno 9 zpráv z 9.