有没有一种方法可以在JavaFX中对场景进行简单的刷新

有没有一种方法可以在JavaFX中对场景进行简单的刷新,java,javafx,Java,Javafx,更新:根据@kleopatra评论 关闭包含文本字段的窗口时,我想从另一个控制器的文本字段中的字符串设置按钮的文本 public class Controller { @FXML Button btn1; public void initialize(){ renderBtns(); } public void renderBtns(){ btn1.addEventHandler(MouseEvent.MOUSE_CLICK

更新:根据@kleopatra评论

关闭包含
文本字段的窗口时,我想从另一个控制器的
文本字段中的
字符串设置
按钮的文本

public class Controller {

    @FXML Button btn1;

    public void initialize(){
        renderBtns();
    }

    public void renderBtns(){

        btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
    }
}
我正在为
按钮
鼠标单击事件使用自定义处理程序。(请记住,这是我代码的简化版本,我需要在完整代码中使用此处理程序)

这是CustomButtonHandler:

   public class CustomButtonHandler implements EventHandler {

    int id;

    public CustomButtonHandler(int id){
        this.id = id;
    }

    @Override
    public void handle(Event event) {
        try {

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("smetka.fxml"));
            Parent root = fxmlLoader.load();
            SmetkaControl controller = fxmlLoader.getController();
            controller.setId(id);
            Scene scene = new Scene(root);
            Stage stage = new Stage();
            stage.setTitle("Сметка - Маса" + " " + id);
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setOnHiding(event1 -> {
                try {
                    controller.exitScene();
                } catch (IOException | ParseException e) {
                    e.printStackTrace();
                }
            });
            stage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class CustomButtonHandler implements EventHandler {

    int id;

    public CustomButtonHandler(int id){
        this.id = id;
    }

    @Override
    public void handle(Event event) {
        try {

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("smetka.fxml"));
            Parent root = fxmlLoader.load();
            SmetkaControl controller = fxmlLoader.getController();
            controller.setId(id);
            Scene scene = new Scene(root);
            Stage stage = new Stage();
            stage.setTitle("Сметка - Маса" + " " + id);
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setOnHiding(event1 -> {
                controller.exitScene();
            });
            stage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
这是我的另一个-
SmetkaControl

public class SmetkaControl {

    int id;
    @FXML
    TextField txtField;

    public void setId(int id) {
        this.id = id;
    }

    public void initialize() {

    }

    public void exitScene() throws IOException, ParseException {

        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getResource("sample.fxml"));
        fxmlLoader.load();
        Controller controller = fxmlLoader.getController();
        txtField.setFocusTraversable(false);
        controller.btn1.setText(txtField.getText());
        System.out.println(controller.btn1.getText());

    }
}
sample.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.BorderPane?>


    <BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
       <center>
          <Button fx:id="btn1" mnemonicParsing="false" text="Button" BorderPane.alignment="CENTER" />
       </center>
    </BorderPane>
当我关闭窗口时,我在控制台中获得了正确的值(来自btn1.getText()),但按钮保持不变

为什么它在控制台中给了我正确的值,但图形没有改变


如何正确执行此操作?

结果表明,我的问题不是刷新屏幕,而是创建了
控制器的新实例,因此在运行时没有显示更改。(当我在
exitScene()
中运行
stage.show()
时,显示了新实例)

如果我在
应用程序
类中创建一个控制器实例,然后通过该类调用它,它将按照我的需要工作

像这样:

主要内容:

CustomButtonHandler:

   public class CustomButtonHandler implements EventHandler {

    int id;

    public CustomButtonHandler(int id){
        this.id = id;
    }

    @Override
    public void handle(Event event) {
        try {

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("smetka.fxml"));
            Parent root = fxmlLoader.load();
            SmetkaControl controller = fxmlLoader.getController();
            controller.setId(id);
            Scene scene = new Scene(root);
            Stage stage = new Stage();
            stage.setTitle("Сметка - Маса" + " " + id);
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setOnHiding(event1 -> {
                try {
                    controller.exitScene();
                } catch (IOException | ParseException e) {
                    e.printStackTrace();
                }
            });
            stage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class CustomButtonHandler implements EventHandler {

    int id;

    public CustomButtonHandler(int id){
        this.id = id;
    }

    @Override
    public void handle(Event event) {
        try {

            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("smetka.fxml"));
            Parent root = fxmlLoader.load();
            SmetkaControl controller = fxmlLoader.getController();
            controller.setId(id);
            Scene scene = new Scene(root);
            Stage stage = new Stage();
            stage.setTitle("Сметка - Маса" + " " + id);
            stage.setScene(scene);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.setOnHiding(event1 -> {
                controller.exitScene();
            });
            stage.show();


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
SmetkaControl:

public class SmetkaControl {

    int id;
    @FXML
    TextField txtField;

    public void setId(int id) {
        this.id = id;
    }

    public void initialize() {

    }

    public void exitScene() {

        Main.controller.btn1.setText(txtField.getText());

    }
}
控制器:

public class Controller {

    @FXML Button btn1;

    public void initialize(){
        renderBtns();
    }

    public void renderBtns(){

        btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
    }

    public void clickBtn(){

    }
}

请..好的初学者:)仍然缺少:fxml文件和应用程序顺便说一句:您知道您在exitScene中创建了一个新控制器(与处理程序按钮所在的控制器无关),并且不在任何地方使用它?@kleopatra我实际上没有意识到我创建了一个新控制器。。。我应该如何引用现有的而不是创建新的?我以为getController()给了我现有的我以为getController()给了我现有的你的假设是错误的;)
public class Controller {

    @FXML Button btn1;

    public void initialize(){
        renderBtns();
    }

    public void renderBtns(){

        btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
    }

    public void clickBtn(){

    }
}