0

I have two FXML pages each with its controller. The main one (homepage.fxml) reads budget items from a database. It has an edit button which opens the secondary FXML file (editBudget.fxml) with its own controller. In the secondary FXML, you can enter new budget values that update the database.

If I update the values and then restart the program the main FXML file opens with the new values but I would like it to update as soon as I press post on the second FXML file.

HomepageController

package homepage;

import datasource.BudgetData;
import datasource.DbConnect;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class HomepageController implements Initializable {

    @FXML
    private Label dateDashboard;

    @FXML
    private Label cashDashboard;

    @FXML
    private Label bankDashboard;

    @FXML
    private Label mobileMoneyDashboard;

    @FXML
    private Label totalAssetsDashboard;

    @FXML
    private Label budgetedDashboard;

    @FXML
    private Label bCoverDashboard;

    @FXML
    private Label budgetCoverperDashboard;

    @FXML
    private DatePicker datepicker;

    @FXML
    private TextField cashfield;

    @FXML
    private TextField mpesafield;

    @FXML
    private TextField bankfield;

    @FXML
    private Button postbutton;


    @FXML
    private MenuItem deleteMenuItem;

    @FXML
    private Label rentBudget;

    @FXML
    private Label deductionsBudget;

    @FXML
    private Label garbageBudget;

    @FXML
    private Label electricityBudget;

    @FXML
    private Label gasBudget;

    @FXML
    private Label entBudget;

    @FXML
    private Label shoppingBudget;

    @FXML
    private Label airtimeBudget;

    @FXML
    private Label tvBudget;

    @FXML
    private Label transportBudget;

    @FXML
    private Label foodBudget;

    @FXML
    private Label budgetTotalSet;

    private ObservableList<BudgetData> budgetDataObservableList;

    DbConnect dbConnect = DbConnect.getInstance();

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        loadBudgetData();
    }

    @FXML
    void handleEditBudget(ActionEvent event) {


        try {

            AnchorPane parent = (AnchorPane) 
 FXMLLoader.load(getClass().getResource("editBudget.fxml"));
            Stage stage = new Stage();
            stage.setScene(new Scene(parent));
            stage.setTitle("Update Budget");
            stage.setResizable(false);
            stage.show();


        } catch (IOException ex) {
            Logger.getLogger(HomepageController.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("handleEditBudget(): " + ex.getMessage());
        }
    }


    public void loadBudgetData() {

        try {
            Connection connection = dbConnect.getConnection();
            String sqlselect = "SELECT * FROM budget WHERE ROWID = (SELECT max(ROWID) from budget)";
            System.out.println(sqlselect);
            ResultSet resultSet = connection.createStatement().executeQuery(sqlselect);

            budgetDataObservableList = FXCollections.observableArrayList();
            while (resultSet.next()) {

                budgetDataObservableList.add(new BudgetData(resultSet.getString(1),
                        resultSet.getString(2), resultSet.getString(3),
                        resultSet.getString(4), resultSet.getString(5), resultSet.getString(6),
                resultSet.getString(7), resultSet.getString(8), resultSet.getString(9), 
                resultSet.getString(10), resultSet.getString(11)));
            }

            connection.close();
        } catch (SQLException e) {

            System.out.println("loadBudgetData(): " + e.getMessage());
        }

        int IntRent = Integer.parseInt(budgetDataObservableList.get(0).getRent());
        int intDeductions = Integer.parseInt(budgetDataObservableList.get(0).getDeductions());
        int intGarbage = Integer.parseInt(budgetDataObservableList.get(0).getGarbage());
        var intElectricity = Integer.parseInt(budgetDataObservableList.get(0).getElectricity());
        int intGas = Integer.parseInt(budgetDataObservableList.get(0).getGas());
        int intShopping = Integer.parseInt(budgetDataObservableList.get(0).getShopping());
        int intAirtime = Integer.parseInt(budgetDataObservableList.get(0).getAirtime());
        int intTv = Integer.parseInt(budgetDataObservableList.get(0).getTv());
        int intTransport = Integer.parseInt(budgetDataObservableList.get(0).getTransport());
        int intFood = Integer.parseInt(budgetDataObservableList.get(0).getFood());
        int intEntertainment = Integer.parseInt(budgetDataObservableList.get(0).getEntertainment());

        int intTotal = IntRent + intDeductions + intGarbage + intElectricity + intGas + intShopping + intAirtime + intTv + intTransport + intFood + intEntertainment;
        String stringTotal = Integer.toString(intTotal);



        try {

           rentBudget.setText(budgetDataObservableList.get(0).getRent());
           deductionsBudget.setText(budgetDataObservableList.get(0).getDeductions());
           garbageBudget.setText(budgetDataObservableList.get(0).getGarbage());
           electricityBudget.setText(budgetDataObservableList.get(0).getElectricity());
           gasBudget.setText(budgetDataObservableList.get(0).getGas());
           shoppingBudget.setText(budgetDataObservableList.get(0).getShopping());
           airtimeBudget.setText(budgetDataObservableList.get(0).getAirtime());
           tvBudget.setText(budgetDataObservableList.get(0).getTv());
           transportBudget.setText(budgetDataObservableList.get(0).getTransport());
           foodBudget.setText(budgetDataObservableList.get(0).getFood());
           entBudget.setText(budgetDataObservableList.get(0).getEntertainment());

        } catch (Exception e) {

            System.out.println("setcellvalue: " + e.getMessage());
        }
    }
}

editbudgetcontroller

package homepage;

import datasource.DbConnect;

import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.util.StringConverter;
import javafx.util.converter.DoubleStringConverter;

public class editBudgetController implements Initializable {

    @FXML
    private TextField editRent;

    @FXML
    private TextField editDeductions;

    @FXML
    private TextField editGarbage;

    @FXML
    private TextField editElectricity;

    @FXML
    private TextField editGas;

    @FXML
    private TextField editShopping;

    @FXML
    private TextField editAirtime;

    @FXML
    private TextField editTv;

    @FXML
    private TextField editTransport;

    @FXML
    private TextField editFood;

    @FXML
    private TextField editEntertainment;

    @FXML
    private Label totalLabel;
    DbConnect dbConnect;

    @FXML
    private HomepageController homepageController;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        showTotals();
    }


    @FXML
    void handleClearButton() {

        this.editRent.setText(null);
        this.editDeductions.setText(null);
        this.editGarbage.setText(null);
        this.editElectricity.setText(null);
        this.editGas.setText(null);
        this.editShopping.setText(null);
        this.editAirtime.setText(null);
        this.editTv.setText(null);
        this.editTransport.setText(null);
        this.editFood.setText(null);
        this.editEntertainment.setText(null);
    }

    @FXML
    void handlePostButton(ActionEvent event) {

        updateBudget();
        handleClearButton();
    }

    @FXML
    public void showTotals() {

        DoubleProperty rent = new SimpleDoubleProperty();
        DoubleProperty deductions = new SimpleDoubleProperty();
        DoubleProperty garbage = new SimpleDoubleProperty();
        DoubleProperty electricity = new SimpleDoubleProperty();
        DoubleProperty gas = new SimpleDoubleProperty();
        DoubleProperty shopping = new SimpleDoubleProperty();
        DoubleProperty airtime = new SimpleDoubleProperty();
        DoubleProperty tv = new SimpleDoubleProperty();
        DoubleProperty transport = new SimpleDoubleProperty();
        DoubleProperty food = new SimpleDoubleProperty();
        DoubleProperty entertainment = new SimpleDoubleProperty();
        DoubleProperty total = new SimpleDoubleProperty();

        // can also use (add(rent, garbage))
        total.bind(rent.add(deductions.add(garbage.add(electricity.add(gas.add(shopping.add(airtime.add(tv.add(transport.add(food.add(entertainment)))))))))));

        StringConverter<? extends Number> stringConverter = new DoubleStringConverter();

        Bindings.bindBidirectional(editRent.textProperty(), rent, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editDeductions.textProperty(), deductions, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editGarbage.textProperty(), garbage, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editElectricity.textProperty(), electricity, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editGas.textProperty(), gas, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editShopping.textProperty(), shopping, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editAirtime.textProperty(), airtime, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editTv.textProperty(), tv, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editTransport.textProperty(), transport, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editFood.textProperty(), food, (StringConverter<Number>) stringConverter);
        Bindings.bindBidirectional(editEntertainment.textProperty(), entertainment, (StringConverter<Number>) stringConverter);

        // BInd total
        totalLabel.textProperty().bind(total.asString());

    }

    @FXML
    public void updateBudget() {

        String sqlinsert = "INSERT INTO budget(rent, deductions, garbage, electricity, gas, shopping, airtime, tv, transport, food, entertainment) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

        try {

            Connection connection = dbConnect.getConnection();
            PreparedStatement insertPreparedStatement = connection.prepareStatement(sqlinsert);
            insertPreparedStatement.setString(1, this.editRent.getText());
            insertPreparedStatement.setString(2, this.editDeductions.getText());
            insertPreparedStatement.setString(3, this.editGarbage.getText());
            insertPreparedStatement.setString(4, this.editElectricity.getText());
            insertPreparedStatement.setString(5, this.editGas.getText());
            insertPreparedStatement.setString(6, this.editShopping.getText());
            insertPreparedStatement.setString(7, this.editAirtime.getText());
            insertPreparedStatement.setString(8, this.editTv.getText());
            insertPreparedStatement.setString(9, this.editTransport.getText());
            insertPreparedStatement.setString(10, this.editFood.getText());
            insertPreparedStatement.setString(11, this.editEntertainment.getText());

            insertPreparedStatement.execute();

            this.editRent.setText(null);
            this.editDeductions.setText(null);
            this.editGarbage.setText(null);
            this.editElectricity.setText(null);
            this.editGas.setText(null);
            this.editShopping.setText(null);
            this.editAirtime.setText(null);
            this.editTv.setText(null);
            this.editTransport.setText(null);
            this.editFood.setText(null);
            this.editEntertainment.setText(null);

            Alert alert = new Alert(Alert.AlertType.INFORMATION);
            alert.setHeaderText("Success!!");
            alert.showAndWait();

            connection.close();

        } catch (SQLException e) {

            System.out.println("updateBudget() " + e.getMessage());

        }
    }
}

In case you would like to run it github

crafty
  • 53
  • 5
  • Use a MVC approach, and keep the data in an observable model, which you can share with both controllers. See (among others) https://stackoverflow.com/questions/32342864/applying-mvc-with-javafx/32343342#32343342 – James_D Apr 10 '20 at 12:26
  • Can you add your `BudgetData` class? Does it (or can it?) use JavaFX properties? – James_D Apr 10 '20 at 13:34
  • 1
    [mcve] please .. mind the _M_ and post it here – kleopatra Apr 10 '20 at 14:25
  • Yes; please create a project that demonstrates the issue with minimum code. I actually started writing an answer, and gave up because you have so many labels and text fields. You don't need all those to demonstrate the issue. – James_D Apr 10 '20 at 15:33

0 Answers0