Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
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í.
discount 30 + hiring
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.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
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
Petr Štechmüller
Překladatel
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.