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);
}
}
}