2013-10-03 161 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線程可以利用的時間來更新標籤等