javafx2.0 - 强制刷新场景

时间:2013-10-03 07:14:48

标签: javafx-2 fxml

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

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

情境:

场景 enter image description here

弹出窗口 - 如果我们点击添加,那么我们需要关闭该对话框并更改上一个场景中的电子邮件文本。 enter image description here

4 个答案:

答案 0 :(得分:1)

正如亚历山大上面提到的,更新用于显示电子邮件的对象的基础文本属性应该是Just Work。您需要确保使用该属性(有关详细信息,请参阅Oracle Java FX Property Tutorial)。作为一个具体的例子:

<强> 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

答案 1 :(得分:1)

每当您感觉手动想要更新场景时,您应该使用backgroundWorker Thread来完成工作。 这样,您的UI线程可以使用时间来更新标签等。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

刷新场景它不可能没有关闭......但如果你可以做控制的类级别声明..使它们静止它可能有用...

试试这个..

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

MainPanel.java

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

LoginPanel.java

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


    }          
    });