IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: JavaFX - NullPointerException u elementu po načtení druhé scény

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

Aktivity
Avatar
Navry
Člen
Avatar
Navry:1.4.2018 11:57

Mám dvě scény definované pomocí FXML a jeden kontroler. Po úspěšném načtení (a zobrazení) druhé scény po kliknutí na tlačítko v první scéně dostávám NullPointerEx­ception při práci s Labelem, který je ve druhé scéně. Poradíte mi prosím co dělám špatně?

Část kontroleru:

/* ... */
@FXML
private Label labelMoveActual;
@FXML
private Label labelMoveMax;
/* ... */

// Nejdříve se kliká na jedno tlačítko v 1. scéně, které má tuto obslužnou metodu
    @FXML
    void handleButtonAnalyzeOnAction(ActionEvent event) {
        /* ... */
            try {
                rootOfMainScene = FXMLLoader.load(getClass().getResource("mainScene.fxml"));
            } catch (IOException ex) {
                new Alert(Alert.AlertType.ERROR, "Nepodařilo se načíst hlavní scénu. Program bude ukončen.").showAndWait();
                System.exit(0);
            }
            this.mainScene = new Scene(rootOfMainScene);
            this.primaryStage = (Stage) buttonInterpreter.getScene().getWindow();
        }

// Potom se kliká na druhé tlačítko také v 1. scéně a zde nastává problém
    @FXML
    void handleButtonInterpreterOnAction(ActionEvent event) {
        /* ... */
        this.primaryStage.setScene(mainScene);

        //TODO tady NullPointerException
        labelMoveActual.setText(String.valueOf(0));
        labelMoveMax.setText(String.valueOf(analyzer.getCountOfMoves()));
    }
 
Odpovědět
1.4.2018 11:57
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:3.4.2018 9:24

No a inicializuješ někde ten Label? Vždyť v tom xmlklu akorát stylizuješ nody, ale nikde jej nevytváříš, takže když voláš příkaz:

labelMoveActual.setText(String.valueOf(0));

Tak ti ta proměnná labelMoveActual odkazuje na null, neboli nikam.

A jestli to je fakt tímhle, tak na chvíli zapomeň na FX a projdi si pořádně zdejší tutoriály, protože toto je základní chyba OOP, na kterou je škoda zakládat ticket:(

Editováno 3.4.2018 9:25
Nahoru Odpovědět
3.4.2018 9:24
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Navry
Člen
Avatar
Navry:3.4.2018 16:59

Inicializace elementů definovaných v FXML probíhá přeci automaticky? U jiných programů co jsem vytvářel jsem nikdy nic takovýho nemusel dělat.

Já bych očekával, že po tomto řádku už budou ty labely inicializovány.

rootOfMainScene = FXMLLoader.load(getClass().getResource("mainScene.fxml"));

Viz obrázek.

 
Nahoru Odpovědět
3.4.2018 16:59
Avatar
Odpovídá na Navry
Petr Štechmüller:3.4.2018 17:53

Podle mě celý problém bude spočívat v tom, že máš jeden kontroler pro dva pohleddy.

Jak přesně si Ty představuješ, že to má fungovat?
Z kódu lze pouze přečíst, že se snažíš jakým si způsobem přepnout scény z jedné na druhou.
Máš jistotu, že se při změně scény nevytvoří nová instance kontroleru, která má inicializované ty labely?

Nahoru Odpovědět
3.4.2018 17:53
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 4 zpráv z 4.