2013-10-03 115 views
2

在我的应用程序中,有一个场景具有由一些字段和按钮组成的弹出对话框。如果你点击按钮,那么我想关闭弹出对话框以及更新场景中的一些字段。间接我想刷新场景。可能吗?javafx2.0 - 强制刷新场景

我使用了下面的代码。我做的是,我得到该场景的控制器,然后使用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

+0

你可以张贴的“添加”,在那里您关闭该对话框,将电子邮件文本的ActionHandler? –

回答

0

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

所以,你需要的只是更新属性。或者,有没有真正的麻烦?

+1

是的,我改变了属性,但它不影响用户界面。 – naresh

+0

是否需要调用像setGraphic(root)这样的方法来更新我们的更改UI? – naresh

+0

是的,你提供了属性的新值(例如gprahic节点),并且这个属性上有一个侦听器,它需要皮肤类来更新布局。当布局更新时,场景图会将子树(在场景图中)标记为脏,并且子树将被重新渲染 –

0

刷新场景中的不可能不关闭...但如果你能为control..ie做一流水平的声明让他们静其可以工作...

试试这个..

使主文件中的功能。

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()); 


    }   
    }); 
+5

添加公共静态方法来解决此问题是一个可怕的想法。 – chooks

+0

但我们可以做出课堂级别的声明......我用它和它的完美工作。 –

+0

智慧之路NP难。有一天你可能会意识到为什么使用类级别的静态方法来处理实例数据是一个坏主意。也许你需要这个作为一个黑客,让你通过一个demo,但是这是避免技术债务,很容易(和最佳)。 – chooks

1

亚历山大如上所述,更新您所使用的显示电子邮件应该只是工作的对象的基础文本属性。你需要确保你正在与财产(见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()); 
} 

或者,您可以将ema金正日text属性设置为邮件标签属性,这样的变化将自动获得传播:

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

你可以这样做在你的控制器initialize()方法。

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

  • chooks
1

每当你有想手动更新你应该使用一个BackgroundWorker线程做的工作场景的感觉。 这样你的UI线程可以利用的时间来更新标签等