Problema com NullPointerException ao acessar elementos em arquivo FXML no JavaFX

Tenho uma aplicação JavaFX com duas telas: a tela principal e uma tela secundária. A tela principal contém um menu e a secundaria um botão “buyButton” que está dentro de outro arquivo FXML que é carregado na tela principal.

No meu código JavaFX, estou tentando acessar o elemento root da tela principal para realizar algumas operações quando o botão “buyButton” é pressionado. No entanto, estou recebendo um NullPointerException sempre que tento acessar o root, e isso está impedindo o funcionamento adequado da minha aplicação.

O que já fiz:

  • Verifiquei a hierarquia de elementos nos arquivos FXML e confirmei que eles estão mapeados corretamente.
  • Associei corretamente os controladores JavaFX aos arquivos FXML correspondentes usando a anotação @FXML.
  • Utilizei depuração para tentar identificar o ponto exato do erro, que ocorre ao tentar acessar o root.
  • Revisei os nomes de arquivos e referências para garantir que estejam consistentes.
package com.example.sprintjava;

import com.example.dao.ProdutoDAO;
import com.example.entity.Produto;
import javafx.application.Platform;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;

import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MainClientController {

    ProdutoDAO productDAO = new ProdutoDAO();
    List<Produto> productList;

    @FXML
    private Rectangle rectangle;

    @FXML
    private Pane root;

    @FXML
    private FlowPane container;

    @FXML
    private void initialize() {
        if (root != null){
            loadPage("mainClientPanel",160,20);
        }
        productList = productDAO.getAllProdutos();
        Platform.runLater(this::createProductCards);
    }

    @FXML
    private void closeClicked(){
        javafx.application.Platform.exit();
    }

    private void createProductCards() {
        if (container != null){
            for (Produto product : productList) {
                createProductCard(product);
            }
        }
    }
    private void createProductCard(Produto product) {
        AnchorPane card = new AnchorPane();
        card.setPrefHeight(269.0);
        card.setPrefWidth(219.0);
        card.setStyle("-fx-background-color: #D9D9D9; -fx-background-radius: 7px; -fx-border-radius: 7px;  -fx-end-margin: 10px");

        container.setHgap(10);
        container.setVgap(10);

        Produto cachedProduct = DataCache.getProductById(product.getId());

        if (cachedProduct != null) {
            // Os dados do produto estão em cache, use-os diretamente
            product = cachedProduct;
        } else {
            // Os dados do produto não estão em cache, armazene-os em cache
            DataCache.cacheProduct(product);
        }

        // Label para a marca
        Label brandLabel = new Label(product.getMarca());
        brandLabel.setLayoutX(5.0);
        brandLabel.setLayoutY(4.0);
        brandLabel.setStyle("-fx-font-weight: 700; -fx-font-size: 24px");
        card.getChildren().add(brandLabel);

        // Label para a descrição
        Label descriptionLabel = new Label(product.getDescricao());
        descriptionLabel.setLayoutX(5.0);
        descriptionLabel.setLayoutY(34.0);
        descriptionLabel.setStyle("-fx-font-weight: 700; -fx-text-fill: #8bb57a; -fx-font-size: 17px");
        descriptionLabel.setFont(Font.font("Arial", FontWeight.BOLD, 17));
        card.getChildren().add(descriptionLabel);

        // Label para a quantidade de ml
        Label mlLabel = new Label(product.getMl());
        mlLabel.setLayoutX(5.0);
        mlLabel.setLayoutY(234.0);
        mlLabel.setStyle("-fx-font-weight: 700; -fx-text-fill: #8bb57a; -fx-font-size: 16px");
        mlLabel.setFont(Font.font("Arial", FontWeight.BOLD, 16));
        card.getChildren().add(mlLabel);

        // Label para o preço
        Label priceLabel = new Label("R$ " + product.getPreco());
        priceLabel.setLayoutX(127.0);
        priceLabel.setLayoutY(228.0);
        priceLabel.setStyle("-fx-font-weight: 700; -fx-font-size: 20px");
        priceLabel.setFont(Font.font("Arial", FontWeight.BOLD, 20));
        card.getChildren().add(priceLabel);

        // Carregamento da imagem em segundo plano
        loadProductImageAsync(product.getLinkImagem(), card);

        container.getChildren().add(card);
    }

    private void loadProductImageAsync(String imageURL, AnchorPane card) {
        Image cachedImage = ImageCache.getImageByURL(imageURL);

        if (cachedImage != null) {
            // A imagem está em cache, use-a diretamente
            displayImage(cachedImage, card);
        } else {
            // A imagem não está em cache, carregue-a em segundo plano
            ImageCache.cacheImage(imageURL);

            Thread imageLoadThread = new Thread(() -> {
                Image image = new Image(imageURL, true);
                image.progressProperty().addListener((observable, oldValue, newValue) -> {
                    if (newValue.doubleValue() >= 1.0) {
                        // A imagem foi completamente carregada, exiba-a na plataforma JavaFX
                        Platform.runLater(() -> displayImage(image, card));
                    }
                });
            });
            imageLoadThread.setDaemon(true);
            imageLoadThread.start();
        }
    }

    private void displayImage(Image image, AnchorPane card) {
        ImageView imageView = new ImageView(image);
        imageView.setFitWidth(93);
        imageView.setFitHeight(152);
        imageView.setLayoutX(62.5);
        imageView.setLayoutY(58.5);
        card.getChildren().add(imageView);
    }


    @FXML
    void homeClicked(MouseEvent event) {
        loadPage("mainClientPanel",160,20);
        rectangle.setLayoutX(12);
        rectangle.setLayoutY(31);
    }

    @FXML
    void cartClicked(MouseEvent event) {
        loadPage("mainClientPanel", 0,0);
        rectangle.setLayoutX(12);
        rectangle.setLayoutY(154);
    }

    @FXML
    void storeClicked(MouseEvent event) {
        loadPage("storeClientPanel",110,20);
        rectangle.setLayoutX(12);
        rectangle.setLayoutY(92);
    }

    @FXML
    void mouseEntered(MouseEvent event) {
        Node sourceNode = (Node) event.getSource();

        sourceNode.setStyle("""
                 transition: -fx-background-color 1s ease,
                    -fx-scale-x 1s ease,
                    -fx-scale-y 1s ease;

                    -fx-scale-x: 1.03;
                    -fx-scale-Y: 1.03;
                """);
    }

    @FXML
    void mouseExited(MouseEvent event) {
        Node sourceNode = (Node) event.getSource();

        sourceNode.setStyle("""
                 transition: -fx-background-color 1s ease,
                    -fx-scale-x 1s ease,
                    -fx-scale-y 1s ease;

                    -fx-scale-x: 1;
                    -fx-scale-Y: 1;
                """);
    }

    @FXML
    void buyButton(){
        loadPage("storeClientPanel", 110,20);
        rectangle.setLayoutX(12);
        rectangle.setLayoutY(92);
    }

    private void loadPage(String page, int x, int y){
        Parent newPane = null;

        try {
            newPane = FXMLLoader.load(Objects.requireNonNull(getClass().getResource(page + ".fxml")));
        } catch (IOException ex){
            Logger.getLogger(MainClientController.class.getName()).log(Level.SEVERE, null, ex);
        }

        if (newPane != null) {
            // Limpa todos os filhos do StackPane e adiciona o novo painel carregado
            root.getChildren().clear();
            newPane.setLayoutX(x);
            newPane.setLayoutY(y);
            root.getChildren().add(newPane);
        }
    }

}

Dá uma olhada nesse post

Veja que foi criado um metodo setApplication(Aplicacao_principal) dentro do Controller
e por aí faz todas a ligações com o programa principal, veja tambem que não é colocado dentro
do private void initialize()

Se você não entender alguma coisa diga, que ai vamos pensar em isolar um exemplo mais
proximo do seu uso, mas o erro é por causa disso.

Bons Codigos

Funcionouu cara, muito obrigado já estava ficando louco

1 curtida