Javafx 2 javafx2.0-强制刷新场景

Javafx 2 javafx2.0-强制刷新场景,javafx-2,fxml,Javafx 2,Fxml,在我的应用程序中,一个场景具有弹出对话框,其中包括一些字段和按钮。如果单击该按钮,则我希望关闭弹出对话框并更新场景中的某些字段。间接地,我想刷新场景。可能吗 我使用了下面的代码。这里我做的是,我得到了那个场景的控制器,然后用id更新这个字段。但是它不起作用 URL location = AdmincontrolController.class.getResource("admincontrol.fxml"); FXMLLoader fxmlLoader = new FXMLLoader()

在我的应用程序中,一个场景具有弹出对话框,其中包括一些字段和按钮。如果单击该按钮,则我希望关闭弹出对话框并更新场景中的某些字段。间接地,我想刷新场景。可能吗

我使用了下面的代码。这里我做的是,我得到了那个场景的控制器,然后用id更新这个字段。但是它不起作用

 URL location = AdmincontrolController.class.getResource("admincontrol.fxml");

 FXMLLoader fxmlLoader = new FXMLLoader();
 fxmlLoader.setLocation(location);
 fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
 try {
     Parent root = (Parent) fxmlLoader.load(location.openStream());
     AdmincontrolController controller = fxmlLoader.getController();
     System.out.println("AdmincontrolController: "+controller);
     controller.setEmail(item.getEmail());
 } catch (IOException ex) {
     Logger.getLogger(Add_loginController.class.getName()).log(Level.SEVERE, null, ex);
 }
场景:

场景

弹出窗口-如果单击添加,则需要关闭该对话框并更改前一场景中的电子邮件文本。

JavaFX的构建不需要直接调用场景更新例程。您所需要的一切-更新场景组件的属性,它们将在最近的脉冲上更新


所以,您只需要更新属性。或者,有什么真正的问题吗?

如果不关闭,刷新场景是不可能的…但是如果您可以为控件执行类级声明..即使它们成为静态的,它可能会工作

试试这个

在主文件中创建一个函数

MainPanel.java

public static void SetMail(String email)
{
txtmail.setText(email);
}
 btnclear.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {                      
            MainPanel.SetMail(txtEmail.getText());


    }          
    });
LoginPanel.java

public static void SetMail(String email)
{
txtmail.setText(email);
}
 btnclear.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {                      
            MainPanel.SetMail(txtEmail.getText());


    }          
    });
btnclear.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
SetMail(txtEmail.getText());
}          
});

如上所述,更新用于显示电子邮件的对象的基本文本属性应该可以正常工作。您需要确保正在使用该属性(有关更多信息,请参阅)。作为一个具体例子:

FXML

 <Text fx:id="email" />
 <TextField fx:id="emailInput" />
 <Button onAction="#doSetEmail" text="Set Email"/>
或者,您也可以将电子邮件文本属性绑定到电子邮件标签属性,以便自动传播更改:

email.textProperty().bind(emailInput.textProperty());
您可以在控制器
initialize()
方法中执行此操作

现在,所有这些工作的警告取决于您如何处理事件以及您在这方面做了什么。您仍然没有按照第一个答案的要求发布代码,因此您可能会遇到问题。也就是说,如果您正在启动线程,然后试图从一个工作线程更新JavaFX线程上的UI元素,那么您可能会(潜在地)遇到不更新的问题。这在很大程度上取决于对象的结构,而您没有提供足够的信息来对此进行有意义的评论


每当您觉得需要手动更新场景时,您可能应该使用backgroundWorker线程来完成这项工作。
通过这种方式,您的UI线程可以利用时间更新标签等。

是的,我更改了属性,但它不会影响UI。是否需要调用setGraphic(root)等方法来使用我们的更改更新UI?是的,您为属性提供了新值(例如gprahic节点),并且此属性上有侦听器,这需要皮肤类来更新布局。当layoutis更新时,scenegraph会将子树(在场景图中)标记为脏,子树将被重新渲染。您可以发布“添加”的actionHandler吗你在哪里关闭对话框并更改电子邮件文本?添加一个公共静态方法来解决这个问题是一个可怕的想法。但是我们可以进行类级声明…我使用了它,它非常有效。通往智慧的道路是NP难的。有朝一日,您可能会意识到为什么使用类级静态方法处理实例数据是个坏主意。也许你需要这个作为一个黑客让你通过一个演示,但这是技术债务,很容易(最好)避免。好的@chooks谢谢你的建议…我会尝试其他东西和代码,并试图给你更好的方式。