0

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>
James Z
  • 12,209
  • 10
  • 24
  • 44
Minos
  • 1
  • 1

1 Answers1

2

Don't use the same controller class (application.Board) for different FXML files.

Each time you load the FXML, the loader will create a new instance of the controller class, only initializing the FXML fields associated with the new FXML fields in the new controller instance.

In your case, the idEdit field is initialized in the controller instance created by the FXML Loader invoked in your switchEdit() method. But that instance differs from the instance that called the switchEdit() method.

Instead, create a new class to form the controller for the employee data editor.

Use MVC to share a model or pass parameters to the new controller. In your case, the shared model or parameters to pass would be the id or data of the selected employee.

The Makery JavaFX tutorial provides an illustrative example.

jewelsea
  • 150,031
  • 14
  • 366
  • 406
  • I created another class for the edit page, and passed the paramethers thru a function. It worked, Thanks a lot sir! – Minos Sep 28 '22 at 00:16