2

在我的应用程序中,一个场景具有由一些字段和按钮组成的弹出对话框。如果您单击按钮,那么我想关闭弹出对话框并更新场景中的某些字段。间接我想刷新场景。可能吗?

我使用了以下代码。我所做的是,我获取了该场景的控制器,然后使用 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);
 }

设想:

场景 在此处输入图像描述

弹出窗口 - 如果我们单击添加,那么我们需要关闭该对话框并更改前一个场景中的电子邮件文本。 在此处输入图像描述

4

4 回答 4

1

正如 Alexander 上面提到的,更新用于显示电子邮件的对象的底层文本属性应该只是工作。您需要确保您正在使用该属性(有关更多信息,请参阅Oracle Java FX 属性教程)。作为一个具体的例子:

FXML

 <Text fx:id="email" />
 <TextField fx:id="emailInput" />
 <Button onAction="#doSetEmail" text="Set Email"/>

在您的控制器中,使用 @FXML 注释注入对象的具体实例并设置处理程序以调整文本:

控制器

@FXML
Text email;

@FXML
TextField emailInput;

@FXML
public void doSetEmail(ActionEvent ae) {
    email.setText(emailInput.getText());
}

或者,您可以将电子邮件文本属性绑定到电子邮件标签属性,以便自动传播更改:

email.textProperty().bind(emailInput.textProperty());

您可以在控制器initialize()方法中执行此操作。

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

  • chooks
于 2013-11-01T13:31:04.680 回答
1

每次您有手动更新场景的感觉时,您可能应该使用 backgroundWorker 线程来完成工作。这样你的 UI 线程就可以利用时间来更新标签等。

于 2017-07-04T11:39:56.220 回答
0

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

因此,您只需要更新属性即可。或者,有什么真正的麻烦吗?

于 2013-10-03T07:23:54.983 回答
0

刷新场景不关闭是不可能的......但是如果你可以为控制做类级声明......即让它们成为静态它可能会工作......

尝试这个..

在主文件中创建一个函数。

主面板.java

public static void SetMail(String email)
{
txtmail.setText(email);
}

登录面板.java

 btnclear.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent t) {                      
            MainPanel.SetMail(txtEmail.getText());


    }          
    });
于 2013-11-01T09:45:48.833 回答