I am working on a employee management system using java fx and mysql. Basically, when the user click on a row of the tableview, it stock the row data in a employee object, than to String variable. At the same times, an edit scene open. I want the TextField in the new scene to be set up with the previous variable that the row had.
The method displaySelected() is a mouseEvent method, so its in this method that I retrieve row data. Right after retrieving the data, I call switchEdit() method, its only purpose is to open the Edit scene. *Note that retrieving data from row is working just fine, I print it to be sure.
Right after opening the new scene, I use setText method to set the data in the TextField, thats where the error occurs. I get : Cannot invoke "javafx.scene.control.TextField.setText(String)" because "this.idEdit" is null
I doubled check, I got all the necessary @FXML import and I checked previous similar question but it didn't help or maybe I didn't know how to implement it in my own code...
I even tried to setText directly in switchEdit method, but I get the same mistakes, and I think the problem may occur because im using one controller on two scene?
I honestly did my best before asking my question, thanks for your help and Ill take any advice on the way I typed my answer so next time Ill be better at helping you to help me.
Board.java class control the dashboard scene and the edit scene :
public class Board {
@FXML
private TableView<employeeList> employee;
@FXML
private TableColumn<employeeList, String> firstColumn;
@FXML
private TableColumn<employeeList, String> genderColumn;
@FXML
private TableColumn<employeeList, String> idColumn;
@FXML
private TableColumn<employeeList, String> lastColumn;
@FXML
private TableColumn<employeeList, String> yoeColumn;
@FXML
private Button refresh;
public ObservableList<employeeList> data = FXCollections.observableArrayList();
public void refreshTable() {
//CLEAN TABLEVIEW BEFORE REFRESH
employee.getItems().clear();
try {
String query = "select * from employee";
DataBase connectLive = new DataBase();
Connection connectDb = connectLive.getConnection();
Statement st;
ResultSet rs;
st = connectDb.createStatement();
rs = st.executeQuery(query);
employeeList emp;
while (rs.next()) {
emp = new employeeList(rs.getInt("id"), rs.getString("firstname"), rs.getString("lastname"), rs.getString("gender"), rs.getString("yoe"));
data.add(emp);
}
connectDb.close();
} catch (Exception e) {
e.printStackTrace();
}
idColumn.setCellValueFactory(new PropertyValueFactory<employeeList, String>("id"));
firstColumn.setCellValueFactory(new PropertyValueFactory<employeeList, String>("firstname"));
lastColumn.setCellValueFactory(new PropertyValueFactory<employeeList, String>("lastname"));
genderColumn.setCellValueFactory(new PropertyValueFactory<employeeList, String>("gender"));
yoeColumn.setCellValueFactory(new PropertyValueFactory<employeeList, String>("yoe"));
employee.setItems(data);
}
public void displaySelected(MouseEvent event) throws IOException {
employeeList emp = employee.getSelectionModel().getSelectedItem();
if (emp ==null) {
System.out.println("Ya R");
}
else {
String f = emp.getFirstname();
String l = emp.getLastname();
String i = String.valueOf(emp.getId());
String g = emp.getGender();
String y = emp.getYoe();
switchEdit();
idEdit.setText(i);
firstnameEdit.setText(f);
lastnameEdit.setText(l);
genderEdit.setText(g);
yoeEdit.setText(y);
// settEdit(f,l,i,g,y);
}
}
//EDIT
@FXML
private Button exitEdit;
@FXML
private Button buttonfinish;
@FXML
private TextField firstnameEdit;
@FXML
private TextField genderEdit;
@FXML
private TextField idEdit;
@FXML
private TextField lastnameEdit;
@FXML
private TextField yoeEdit;
@FXML
private AnchorPane paneEdit;
public void exitEdit(ActionEvent e) {
Stage stage;
stage = (Stage) paneEdit.getScene().getWindow();
stage.close();
}
public void exit() {
Stage stage;
stage = (Stage) paneEdit.getScene().getWindow();
stage.close();
}
public void switchEdit() throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("/application/Edit.fxml"));
Scene scene = new Scene(root);
scene.setFill(Color.TRANSPARENT);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
Stage primaryStage = new Stage();
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.setScene(scene);
primaryStage.show();
}
public void switchE(ActionEvent e) throws IOException {
switchEdit();
}
}
fxml code for the board:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Board">
<children>
<AnchorPane fx:id="pane2" prefHeight="860.0" prefWidth="920.0" style="-fx-background-color: #1B2430;">
<children>
<VBox layoutX="60.0" layoutY="25.0" prefHeight="797.0" prefWidth="777.0" style="-fx-background-color: #EEEEEE; -fx-background-radius: 30;">
<children>
<AnchorPane prefHeight="28.0" prefWidth="777.0">
<children>
<Button fx:id="exitButton" layoutX="734.0" layoutY="20.0" mnemonicParsing="false" onAction="#exit" prefHeight="20.0" prefWidth="20.0" style="-fx-background-radius: 100; -fx-background-color: #7b3733;" text="X" textFill="#eeeeee">
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.5" />
</color>
</DropShadow>
</effect>
<font>
<Font name="Consolas" size="12.0" />
</font>
</Button>
</children>
</AnchorPane>
<HBox alignment="CENTER" prefHeight="119.0" prefWidth="737.0" style="-fx-background-color: #336e7b; -fx-background-radius: 30;">
<children>
<Label alignment="CENTER" contentDisplay="CENTER" text="Dash Board" textFill="WHITE">
<font>
<Font name="Calibri Light" size="24.0" />
</font>
<HBox.margin>
<Insets right="30.0" />
</HBox.margin>
</Label>
</children>
<VBox.margin>
<Insets left="20.0" right="20.0" top="20.0" />
</VBox.margin>
</HBox>
<HBox prefHeight="42.0" prefWidth="581.0">
<children>
<BorderPane prefHeight="200.0" prefWidth="200.0" />
<BorderPane prefHeight="38.0" prefWidth="1026.0">
<right>
<TextField prefHeight="25.0" prefWidth="219.0" promptText=" Search keywords" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;" BorderPane.alignment="CENTER">
<BorderPane.margin>
<Insets right="20.0" />
</BorderPane.margin>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</TextField>
</right>
<left>
<Button fx:id="refresh" mnemonicParsing="false" onAction="#refreshTable" prefHeight="25.0" prefWidth="82.0" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;" text="" textFill="WHITE" textOverrun="CLIP" BorderPane.alignment="CENTER">
<BorderPane.margin>
<Insets bottom="2.0" left="20.0" />
</BorderPane.margin>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</Button>
</left>
</BorderPane>
</children>
</HBox>
<BorderPane prefHeight="364.0" prefWidth="777.0">
<center>
<TableView fx:id="employee" onMouseClicked="#displaySelected" prefHeight="345.0" prefWidth="737.0" BorderPane.alignment="CENTER">
<columns>
<TableColumn fx:id="idColumn" prefWidth="84.0" text="ID" />
<TableColumn fx:id="firstColumn" prefWidth="163.0" text="First Name" />
<TableColumn fx:id="lastColumn" prefWidth="163.0" text="Last Name" />
<TableColumn fx:id="genderColumn" prefWidth="163.0" text="Gender" />
<TableColumn fx:id="yoeColumn" prefWidth="163.0" text="Year Of Experience" />
</columns>
<BorderPane.margin>
<Insets left="20.0" right="20.0" />
</BorderPane.margin>
</TableView>
</center>
</BorderPane>
<BorderPane prefHeight="60.0" prefWidth="777.0">
<left>
<Button fx:id="addButton" mnemonicParsing="false" onAction="#addButton" prefHeight="25.0" prefWidth="200.0" style="-fx-background-color: #336e7b; -fx-background-radius: 30;" text="Add" textFill="WHITE" BorderPane.alignment="CENTER">
<BorderPane.margin>
<Insets left="20.0" right="20.0" />
</BorderPane.margin>
<font>
<Font name="Calibri" size="18.0" />
</font>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.5" />
</color></DropShadow>
</effect>
</Button>
</left>
<right>
<Button fx:id="deleteButton" mnemonicParsing="false" onAction="#switchD" prefWidth="200.0" style="-fx-background-color: #7b3733; -fx-background-radius: 30;" text="Delete" textFill="WHITE" BorderPane.alignment="CENTER">
<BorderPane.margin>
<Insets left="20.0" right="20.0" />
</BorderPane.margin>
<font>
<Font name="Calibri" size="18.0" />
</font>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.5" />
</color></DropShadow>
</effect>
</Button>
</right>
<center>
<Button fx:id="EditButton" mnemonicParsing="false" onAction="#switchE" prefHeight="25.0" prefWidth="200.0" style="-fx-background-color: #808080; -fx-background-radius: 30;" text="Edit" textFill="WHITE" BorderPane.alignment="CENTER">
<font>
<Font name="Calibri" size="18.0" />
</font>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.5" />
</color></DropShadow>
</effect>
</Button>
</center>
</BorderPane>
<BorderPane prefHeight="57.0" prefWidth="777.0">
<VBox.margin>
<Insets top="90.0" />
</VBox.margin>
<center>
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Copyright © 2022 - Amine Lakhal - Raphael Ducros" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
</children>
</VBox>
</children>
</AnchorPane>
</children>
</AnchorPane>
fxml code for the edit page
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane fx:id="paneEdit" prefHeight="775.0" prefWidth="493.0" style="-fx-background-color: #1B2430;" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Board">
<children>
<VBox layoutX="65.0" layoutY="30.0" prefHeight="715.0" prefWidth="364.0" style="-fx-background-color: #EEEEEE; -fx-background-radius: 30;">
<children>
<Button fx:id="exitEdit" mnemonicParsing="false" onAction="#exitEdit" prefHeight="20.0" prefWidth="20.0" style="-fx-background-radius: 100; -fx-background-color: #7b3733;" text="X" textFill="#eeeeee">
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.5" />
</color>
</DropShadow>
</effect>
<font>
<Font name="Consolas" size="12.0" />
</font>
<VBox.margin>
<Insets left="328.0" top="13.0" />
</VBox.margin>
</Button>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="359.0" style="-fx-background-color: #336e7b; -fx-background-radius: 30;">
<children>
<ImageView>
<image>
<Image url="@edit.png" />
</image>
</ImageView>
<Label alignment="CENTER" contentDisplay="CENTER" text=" Edit Employee" textFill="WHITE">
<font>
<Font name="Calibri Light" size="24.0" />
</font>
<HBox.margin>
<Insets right="30.0" />
</HBox.margin>
</Label>
</children>
<VBox.margin>
<Insets left="20.0" right="20.0" top="20.0" />
</VBox.margin>
</HBox>
<Label prefHeight="35.0" prefWidth="314.0" text="ID Employe *" textFill="#8a959a">
<font>
<Font name="Calibri Italic" size="14.0" />
</font>
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
</Label>
<TextField fx:id="idEdit" prefHeight="35.0" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;">
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
<font>
<Font name="Consolas" size="12.0" />
</font>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</TextField>
<Label prefHeight="35.0" prefWidth="314.0" text="Last Name" textFill="#8a959a">
<VBox.margin>
<Insets left="20.0" right="20.0" top="10.0" />
</VBox.margin>
<font>
<Font name="Calibri Italic" size="14.0" />
</font>
</Label>
<TextField fx:id="lastnameEdit" prefHeight="35.0" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;">
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</TextField>
<Label prefHeight="35.0" prefWidth="473.0" text="First Name" textFill="#8a959a">
<VBox.margin>
<Insets left="20.0" right="20.0" top="15.0" />
</VBox.margin>
<font>
<Font name="Calibri Italic" size="14.0" />
</font>
</Label>
<TextField fx:id="firstnameEdit" prefHeight="35.0" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;">
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</TextField>
<Label prefHeight="35.0" prefWidth="311.0" text="Gender " textFill="#8a959a">
<VBox.margin>
<Insets left="20.0" right="20.0" top="15.0" />
</VBox.margin>
<font>
<Font name="Calibri Italic" size="14.0" />
</font>
</Label>
<TextField fx:id="genderEdit" prefHeight="35.0" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;">
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</TextField>
<Label prefHeight="35.0" prefWidth="318.0" text="Year Of Experience" textFill="#8a959a">
<VBox.margin>
<Insets left="20.0" right="20.0" top="15.0" />
</VBox.margin>
<font>
<Font name="Calibri Italic" size="14.0" />
</font>
</Label>
<TextField fx:id="yoeEdit" prefHeight="35.0" style="-fx-background-radius: 30; -fx-background-color: #D3D3D3;">
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.30000001192092896" />
</color>
</DropShadow>
</effect>
</TextField>
<Label prefHeight="15.0" prefWidth="310.0" text=" Information can be modified later" textFill="#8a959a">
<VBox.margin>
<Insets left="20.0" top="5.0" />
</VBox.margin>
<font>
<Font name="Calibri" size="11.0" />
</font>
</Label>
<HBox prefHeight="35.0" prefWidth="200.0">
<children>
<CheckBox mnemonicParsing="false" text="All data have been confirmed by manager" textFill="#8a959a">
<HBox.margin>
<Insets left="20.0" top="5.0" />
</HBox.margin>
<font>
<Font name="Calibri Italic" size="14.0" />
</font>
</CheckBox>
</children>
</HBox>
<Button fx:id="buttonfinish" mnemonicParsing="false" prefHeight="47.0" prefWidth="359.0" style="-fx-background-radius: 30; -fx-background-color: #336e7b;" stylesheets="@application.css" text="Finish" textFill="WHITE">
<VBox.margin>
<Insets left="20.0" right="20.0" />
</VBox.margin>
<font>
<Font name="Calibri Light" size="18.0" />
</font>
<effect>
<DropShadow offsetY="5.0">
<color>
<Color opacity="0.5" />
</color>
</DropShadow>
</effect>
</Button>
<Text fill="#8a959a" strokeType="OUTSIDE" strokeWidth="0.0" text="All sensitive data are subject to confidentiality rules in force in the province of Quebec. Any illegal use will be punished by law. 23:788:22|667" wrappingWidth="297.13671875">
<VBox.margin>
<Insets bottom="20.0" left="20.0" right="20.0" top="10.0" />
</VBox.margin>
<font>
<Font name="Calibri" size="11.0" />
</font>
</Text>
</children>
</VBox>
</children>
</AnchorPane>