在我的应用程序中,一个场景具有弹出对话框,其中包含一些字段和按钮。如果单击按钮,则我想关闭弹出对话框以及更新场景中的某些字段。间接地我想刷新场景。有可能吗?
我使用了以下代码。我所做的就是,我获得该场景的控制器,然后使用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);
}
情境:
场景
弹出窗口 - 如果我们点击添加,那么我们需要关闭该对话框并更改上一个场景中的电子邮件文本。
答案 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元素,那么您可能会遇到麻烦(可能)没有更新的事情。这在很大程度上取决于对象的结构,并且您没有提供足够的信息以任何有意义的方式对其进行评论。
答案 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());
}
});