我乞求JavaFx,我意识到我需要一些帮助来在运行时更新带有某些TreeItems的TreeView,并且应该在主窗口中对其进行更新。

在这里,您可以看到两个窗口的屏幕截图:

java - 如何使用用户数据更新JavaFX中的TreeView-LMLPHP

较大的是主窗口,它调用(通过单击文件>>新建项目),较小的新窗口。在较小的窗口中,我可以得到键入的字符串,然后单击Enter按钮。

问题是:如何在主窗口(较大)的TreeView中显示由“新项目窗口”(图片中的较小窗口)创建的新项目?
树状视图位于主窗口的左侧。

我希望我很清楚。
这是这些窗口的控制器的代码:

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);

    }


另一个控制器类:

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();
    }

}


请假设我在FXML文件中映射了所有内容。
谢谢

最佳答案

@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");
    }
}

10-08 14:37