Olá estou com um problema em minhas classes Java. Quando tento criar um novo "Fornecedor", o console me resulta o Caused by: java.lang.StackOverflowError.
Aqui estão as minhas classes que interagem entre si. Se alguém poder me auxiliar na resolução deste problema, agradeço.
package view;
import application.Main;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import model.Fornecedor;
import model.Produto;
public class FornecedorOverViewController {
@FXML
private TableView<Fornecedor> tabelaFornecedor;
@FXML
private TableColumn<Fornecedor, Integer> idFornecedor;
@FXML
private TableColumn<Fornecedor, String> nomeFornecedor;
@FXML
private TableColumn<Fornecedor, String> telefoneFornecedor;
@FXML
private Label nome;
@FXML
private Label telefone;
public FornecedorOverViewController() {
}
int i = 0;
private Main main;
@FXML
private void initialize() {
nomeFornecedor.setCellValueFactory(
cellData -> cellData.getValue().nomeProperty());
telefoneFornecedor.setCellValueFactory(
cellData -> cellData.getValue().telefoneProperty());
idFornecedor.setCellValueFactory(new PropertyValueFactory<>("id"));
showFornecedorDetails(null);
tabelaFornecedor.getSelectionModel().selectedItemProperty().addListener(
(observable, oldValue, newValue) -> showFornecedorDetails(newValue));
}
public void setMainI(Main main) {
this.main = main;
tabelaFornecedor.setItems(main.getFornecedorData());
}
private void showFornecedorDetails(Fornecedor fornecedor) {
if (fornecedor != null) {
nome.setText(fornecedor.getNome());
telefone.setText(fornecedor.getTelefone());
} else {
nome.setText(" ");
telefone.setText(" ");
}
}
@FXML
private void handleDeleteFornecedor() {
int selectedIndex = tabelaFornecedor.getSelectionModel().getSelectedIndex();
if (selectedIndex >= 0) {
tabelaFornecedor.getItems().remove(selectedIndex);
} else {
}
}
@FXML
private void handleNewFornecedor() {
Fornecedor newFornecedor = new Fornecedor(null,0);
boolean okClicked = main.showFornecedorEditDialog(newFornecedor);
if (okClicked) {
main.getFornecedorData().add(newFornecedor);
}
}
}
package application;
import java.io.IOException;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import model.Categoria;
import model.Fornecedor;
import model.Produto;
import model.Usuario;
import view.FornecedorEditDialog;
import view.FornecedorOverViewController;
import view.LoginController;
import view.ProdutoEditDialog;
import view.ProdutoOverViewController;
import view.RootLayoutController;
public class Main extends Application {
private Stage primaryStage;
private BorderPane rootLayout;
private AnchorPane loginLayout;
private ObservableList<Produto> produtoData = FXCollections.observableArrayList();
private ObservableList<Fornecedor> fornecedorData = FXCollections.observableArrayList();
private ObservableList<Usuario> usuarioData = FXCollections.observableArrayList();
private ObservableList<Categoria> categoriaData = FXCollections.observableArrayList();
public Main() {
int i =0;
produtoData.add(new Produto("Skol", 5.99, ++i,199));
produtoData.add(new Produto("Budweiser", 8.99, ++i,2002));
produtoData.add(new Produto("Heineken", 12.00, ++i,22));
i = 0;
fornecedorData.add(new Fornecedor("Ambev", ++i));
fornecedorData.add(new Fornecedor("Cervejaria Heineken", ++i));
fornecedorData.add(new Fornecedor("Coca-Cola", ++i));
fornecedorData.add(new Fornecedor("Fonte-Ijuí", ++i));
i = 0;
usuarioData.add(new Usuario("mateus", "m16s97aa"));
usuarioData.add(new Usuario("dala", "123456"));
usuarioData.add(new Usuario("root", "654321"));
categoriaData.add(new Categoria("Cerveja", ++i));
categoriaData.add(new Categoria("Vinho", ++i));
categoriaData.add(new Categoria("Vodka", ++i));
categoriaData.add(new Categoria("Cachaca", ++i));
i = 0;
}
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("Wine And Beer");
login();
/*
if(click) {
initRootLayout();
showProdutosOverView();
}
*/
}
public void initRootLayout() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("/view/RootLayout.fxml"));
rootLayout = (BorderPane) loader.load();
// Show the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
// Give the controller access to the main app.
RootLayoutController controller = loader.getController();
controller.setMain(this);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
/*
// Try to load last opened person file.
File file = getPersonFilePath();
if (file != null) {
loadPersonDataFromFile(file);
}
*/
}
public void logar() {
primaryStage.close();
initRootLayout();
showProdutosOverView();
//return true;
}
public void login() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("/view/Login.fxml"));
loginLayout = (AnchorPane) loader.load();
// Show the scene containing the root layout.
Scene scene = new Scene(loginLayout);
primaryStage.setScene(scene);
// Give the controller access to the main app.
LoginController controller = loader.getController();
controller.setMain(this);
primaryStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
public void showProdutosOverView() {
try {
// Load person overview.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("/view/Produto.fxml"));
AnchorPane personOverview = (AnchorPane) loader.load();
// Set person overview into the center of root layout.
rootLayout.setCenter(personOverview);
// Give the controller access to the main app.
ProdutoOverViewController controller = loader.getController();
controller.setMain(this);
} catch (IOException e) {
e.printStackTrace();
}
}
public Stage getPrimaryStage() {
return primaryStage;
}
public ObservableList<Produto> getProdutoData() {
return produtoData;
}
public ObservableList<Fornecedor> getFornecedorData(){
return fornecedorData;
}
public ObservableList<Usuario> getUsuarioData(){
return usuarioData;
}
public ObservableList<Categoria> getCategoriaData(){
return categoriaData;
}
public static void main(String[] args) {
launch(args);
}
public boolean showProdutoEditDialog(Produto produto) {
try {
// Load the fxml file and create a new stage for the popup dialog.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("/view/ProdutoEditDialog.fxml"));
AnchorPane page = (AnchorPane) loader.load();
// Create the dialog Stage.
Stage dialogStage = new Stage();
dialogStage.setTitle("Editar Produto");
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.initOwner(primaryStage);
// dialogStage.getIcons().add(new Image("file:resources/images/edit.png"));
Scene scene = new Scene(page);
dialogStage.setScene(scene);
// Set the person into the controller.
ProdutoEditDialog controller = loader.getController();
controller.setDialogStage(dialogStage);
controller.setProduto(produto);
controller.lotarCombo(fornecedorData, categoriaData);
controller.setMain(this);
// Show the dialog and wait until the user closes it
dialogStage.showAndWait();
return controller.isOkClicked();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean showFornecedorEditDialog(Fornecedor fornecedor) {
try {
// Load the fxml file and create a new stage for the popup dialog.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(Main.class.getResource("/view/FornecedorEditDialog.fxml"));
AnchorPane page = (AnchorPane) loader.load();
// Create the dialog Stage.
Stage dialogStage = new Stage();
dialogStage.setTitle("Editar Fornecedor");
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.initOwner(primaryStage);
Scene scene = new Scene(page);
dialogStage.setScene(scene);
// Set the person into the controller.
FornecedorEditDialog controller = loader.getController();
controller.setDialogStage(dialogStage);
controller.setFornecedor(fornecedor);
controller.setMain(this);
// Show the dialog and wait until the user closes it
dialogStage.showAndWait();
return controller.isOkClicked();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
package view;
import application.Main;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import model.Fornecedor;
import model.Produto;
public class FornecedorEditDialog {
@FXML
private TextField nome;
@FXML
private TextField telefone;
private Stage dialogStage;
private Main main;
private int id;
private Fornecedor fornecedor;
private boolean okClicked = false;
@FXML
private void initialize() {
}
public void setDialogStage(Stage dialogStage) {
this.dialogStage = dialogStage;
}
public void setMain(Main main) {
this.main = main;
id = main.getFornecedorData().size();
id = id+1;
}
public void setFornecedor(Fornecedor fornecedor) {
this.fornecedor = fornecedor;
nome.setText(fornecedor.getNome());
telefone.setText(fornecedor.getTelefone());
}
public boolean isOkClicked() {
return isOkClicked();
}
@FXML
private void handleOk() {
if (isInputValid()) {
fornecedor.setNome(nome.getText());
fornecedor.setTelefone(telefone.getText());
if(fornecedor.getId() == 0) {
fornecedor.setId(this.id);
}
okClicked = true;
dialogStage.close();
}
}
@FXML
private void handleCancel() {
dialogStage.close();
}
private boolean isInputValid() {
String errorMessage = "";
if (nome.getText() == null || nome.getText().length() == 0) {
errorMessage += "Produto Invalido!\n";
}
if (telefone.getText() == null || telefone.getText().length() == 0) {
errorMessage += "Preco invalidos!\n";
}
if (errorMessage.length() == 0) {
return true;
} else {
// Show the error message.
return false;
}
}
}