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