Vinicius de Andrade
Vinicius de Andrade

Reputation: 27

How to Update a TreeView in JavaFX with data from users

I am begging with JavaFx, and I realized that I need some help to update a TreeView with some TreeItems in runtime, and it should be updated in the main window.

Here, you can see a screenshot of the two windows:

enter image description here

The bigger is the main window and it calls (by clicking in File >> New Project), new smaller. In the smaller window, I could get the String that is typed and than the enter button is clicked.

The trouble is: How can I show the new items created by the "new project window" (the smaller window in the pic) in the TreeView in the main window(the bigger)? The treeview is in the left side of the main window.

I hope I was clear. Here is the code of the controllers of these windows:

package application;

import java.net.URL;

import java.util.ResourceBundle;

import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeItem.TreeModificationEvent;
import javafx.scene.control.TreeView;
import javafx.stage.Modality;
import javafx.stage.Stage;

/**
 * this class handles with the main window of our LDF Tool
 * @author Vinicius
 * @version 1.0
 */
public class MainController implements Initializable{
    @FXML
    TreeView<String> treeView;
    @FXML
    MenuItem newProject;

    private boolean flag = false;
    private NewProjectWindowController npwc;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }


    @FXML
    public void newProjectClicked(ActionEvent event){
        try{
            flag = true;
            FXMLLoader fxml = new FXMLLoader(getClass().getResource("newProjectWindow.fxml"));
            Parent root = (Parent) fxml.load();         
            Stage newWindow = new Stage();
            newWindow.setTitle("New Project");
            newWindow.initModality(Modality.APPLICATION_MODAL);
            newWindow.setScene(new Scene(root));
            newWindow.show();


        } catch (Exception e) {
            System.out.println("caiu na exceção");
        }
    }

    /**
     * to this method, choose the project's name as argument, and it will be put on the
     * tree with the archives that should be created together
     * @param projectName
     */
    public void doTree(String projectName){     
        TreeItem<String> root = new TreeItem<>("projectName");
        root.setExpanded(true);     
        //TreeItem<String> folha1 = new TreeItem<String>(projectName + " arquivo 1");
        //root.getChildren().add(folha1);
        treeView.setRoot(root);     

    }

The other controller class:

package application;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

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.Button;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

public class NewProjectWindowController implements Initializable{

    @Override
    public void initialize(URL location, ResourceBundle resources) {

    }

    @FXML
    Button cancelButton;
    @FXML
    Button enterButton;
    @FXML
    TextField textInput;
    private String input;

    public String getInput(){
        return this.input;
    }

    @FXML
    public void cancelButtonClicked(ActionEvent event) {
        Stage window = (Stage) this.cancelButton.getParent().getScene().getWindow();
        window.close();
    }

    @FXML
    public void enterButtonClicked(ActionEvent event) {
        input = hasString();
        Stage window = (Stage) this.enterButton.getParent().getScene().getWindow();
        window.close();
    }

    private String hasString(){
        if (this.textInput.getText().isEmpty())
            return null;
        return this.textInput.getText();
    }

}

Please, assume that I mapped everything ok in the FXML file. thanks

Upvotes: 0

Views: 1966

Answers (1)

James_D
James_D

Reputation: 209724

@FXML
public void newProjectClicked(ActionEvent event){
    try{
        flag = true;
        FXMLLoader fxml = new FXMLLoader(getClass().getResource("newProjectWindow.fxml"));
        Parent root = (Parent) fxml.load();         
        Stage newWindow = new Stage();
        newWindow.setTitle("New Project");
        newWindow.initModality(Modality.APPLICATION_MODAL);
        newWindow.setScene(new Scene(root));

        // showAndWait blocks execution until the window closes:
        newWindow.showAndWait();

        NewProjectWindowController controller = fxml.getController();
        String input = controller.getInput();
        if (input != null) {
            TreeItem<String> currentItem = treeView.getSelectionModel().getSelectedItem();
            if (currentItem == null) currentItem = treeView.getRoot();
            currentItem.getChildren().add(new TreeItem<>(input));
        }

    } catch (Exception e) {
        System.out.println("caiu na exceção");
    }
}

Upvotes: 2

Related Questions