Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Refresh TableView (in fxml A controller) on button event in fxml B controller

d1c77e03-403c-4a00-b66c-6405fd7f4a53Dec 7 2017 — edited Dec 11 2017

Hi,

I'm trying to make a table, which would refresh and display all new values whenever a new value is added to it. More specifically, I need to have the TableView(in fxml A controller) refresh on certain button event in fxml B controller. So far, when the button is clicked, the object is successfully created and stored in an array list. But the table does not display this new value right after. Only after I restart the app I can see that the new value has been added to the table. Been looking for a way to somehow work this out, but with no luck. It's probably worth to mention that I've created the GUI panels in SceneBuilder and then added the fxml files to the java project.

Any help is much appreciated! Thanks

Here is the main controller(fxml A) code:

import java.io.FileNotFoundException;

import java.net.URL;

import java.text.ParseException;

import java.util.Collection;

import java.util.ResourceBundle;

import com.sun.javafx.scene.control.skin.TableViewSkinBase;

import javafx.collections.FXCollections;

import javafx.collections.ObservableList;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.fxml.FXMLLoader;

import javafx.fxml.Initializable;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.scene.control.*;

import javafx.scene.control.cell.PropertyValueFactory;

import javafx.scene.layout.BorderPane;

import javafx.stage.Stage;

public class GUIMainController

{

    private MemberList memberList = new MemberList();

    private String filename = "MemberList.txt";

    private MemberFile memberFile = new MemberFile(filename);

        

    @FXML private GUIAddMemberPanelController guiAddMemberPanelController;

    

    @FXML private TableView<Member> tableMembers;

    

        @FXML private TableColumn<Member, String> tcMemberName;

        @FXML private TableColumn<Member, String> tcMemberEmail;  

    

    

    public void initialize() throws FileNotFoundException, ParseException

    {

        tcMemberName.setCellValueFactory(new PropertyValueFactory<Member, String>("name"));

            tcMemberEmail.setCellValueFactory(new PropertyValueFactory<Member, String>("email"));

            tableMembers.setItems(getList());       

    }

    

    public ObservableList<Member> getList() throws FileNotFoundException, ParseException

    {

        ObservableList<Member> members = FXCollections.observableArrayList();

        MemberList memberList = memberFile.readMemberTextFile();

        for (int i = 0; i < memberList.size(); i++)

        {

            members.add(new Member(memberList.getMember(i).getName(), memberList.getMember(i).getEmail()));

        }      

        return members;    

    }  

    

    

    public void setText(String text)

    {

        tfShowMemberName.setText(text);

    }

    

    public void showMemberTable() throws ParseException, FileNotFoundException

    {              

        tcMemberName.setCellValueFactory(new PropertyValueFactory<Member, String>("name"));

        tcMemberEmail.setCellValueFactory(new PropertyValueFactory<Member, String>("email"));

        tableMembers.setItems(getList());

        tableMembers.setEditable(true);

    }    

    public void openAddMemberPanel(ActionEvent event) {

        try {

            FXMLLoader loader = new FXMLLoader();

            loader.setLocation(getClass().getResource("FXML/viaGUIaddNewMemberPanel.fxml"));

            loader.setController(new GUIAddMemberPanelController());

            Parent root = loader.load();

            Stage stage = new Stage();

            Scene scene = new Scene(root);

            stage.setTitle("Add new lecturer");

            stage.setScene(scene);

            stage.show();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

And here is the secondary controller (fxml B) code:

import java.io.FileNotFoundException;

import java.io.IOException;

import java.net.URL;

import java.text.ParseException;

import java.util.ArrayList;

import javax.swing.JOptionPane;

import javafx.collections.FXCollections;

import javafx.collections.ObservableList;

import javafx.event.ActionEvent;

import javafx.fxml.FXML;

import javafx.fxml.FXMLLoader;

import javafx.scene.Parent;

import javafx.scene.Scene;

import javafx.scene.control.*;

import javafx.scene.control.cell.PropertyValueFactory;

import javafx.stage.Stage;

public class GUIAddMemberPanelController

{

    private Member member;

    private String filename = "MemberList.txt";

    private MemberList memberList = new MemberList();

    private MemberFile memberFile = new MemberFile(filename);  

    @FXML private TextField tfEnterMemberName,tfEnterMemberEmail;

    

    @FXML private Button btnAddMember,btnClearAddMemberTextFields,btnCancelAddMemberPanel;

    

    

    public void addMember(ActionEvent event) throws ParseException, CloneNotSupportedException, IOException

    {

     String memberName = tfEnterMemberName.getText();

     String memberEmail = tfEnterMemberEmail.getText();

        member = new Member(memberName,memberEmail);

        memberList.addMemberToList(member);

        memberFile.writeMemberTextFile(memberList);

                

        FXMLLoader loader = new FXMLLoader();

        

        loader.setLocation(getClass().getResource("FXML/viaGUI.fxml"));

        GUIMainController guiMainController = new GUIMainController();

        loader.setController(guiMainController);       

        Parent root = loader.load();

        

        guiMainController.showMemberTable();

        

        cancelAddMemberPanel(event);   

    }     

    public void clearAddMemberTextFields(ActionEvent event)

    {

        tfEnterMemberName.setText("");

        tfEnterMemberEmail.setText("");    

    }

    public void cancelAddMemberPanel(ActionEvent event) throws FileNotFoundException, ParseException

    {

        Stage stage = (Stage) btnCancelAddMemberPanel.getScene().getWindow();

        stage.close();      

    }

}

Member constructor:

public Member(String name, String email) {

        this.name = name;

        this.email = email;

    }

Main program:

public class MainClass extends Application

{

    public static void main(String[] args)

    {

        launch(args);

    }  

    

    public void start(Stage stage) throws Exception {

        FXMLLoader loader = new FXMLLoader();

        loader.setController(new GUIMainController());

        loader.setLocation(getClass().getResource("FXML/viaGUI.fxml"));

        Parent root = loader.load();

        Scene scene = new Scene(root);

        stage.setTitle("MySystem");

        stage.setScene(scene);

        stage.show();      

    }

}

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jan 8 2018
Added on Dec 7 2017
1 comment
3,763 views