2012-03-15 65 views
11

的控制器2我的JavaFX 2.0應用程序,它由兩個FXML文件,和2個控制器,用於他們+一個「主」 java文件。如何FXML控制器1創建的對象傳遞給內FXML控制

的開始時間,FXML1被初始化,這樣的:

public void start(Stage stage) throws Exception { 
    stage.setTitle("Demo Jabber JavaFX Chat"); 

    Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml"), 
     ResourceBundle.getBundle("fxmlexample.fxml_example"));   
    Scene scene = new Scene(root, 226, 264); 
    stage.setScene(scene); 
    scene.getStylesheets().add("fxmlexample/fxmlstylesheet.css"); 
    stage.show(); 
} 

然後,點擊從SCENE1按鈕時,在控制器1類的事件處理程序,我改變SCENE1根,展現新的GUI - 查看用戶。在這個控制器中,我初始化了一些對象。例如像這樣:

public class FXMLExampleController { 
    //some fields... 
    private MySuperObject c; 
    @FXML protected void handleSubmitButtonAction(ActionEvent event) { 
    //some fields... 
    c = new MySuperObject(); //here i initialize my object, i'm interested in 
    try { 
     c.login(username, password); // some actions with this object, which i need to make. 
     Scene cc = buttonStatusText.getScene(); 
     Parent root = null; 
     try { 
      //changing a scene content... 
      root = FXMLLoader.load(getClass().getResource("fxml_example2.fxml"), 
      ResourceBundle.getBundle("fxmlexample.fxml_example")); 
     } catch (IOException ex) { 
      Logger.getLogger(FXMLExampleController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     cc.setRoot(root); 
     } 

而且,在那之後,我必須做一些工作,對下一場景的對象,而且它必須是不一樣的類的新實例,但對象,我已經在第一個場景中初始化了。

我知道如何讓這些全部採用「非標準的Java」,但我是那種對使用JavaFX + FXML這個任務的困惑。

回答

24

在FX中引入了控制器節點2.2新的API:

// create class which is both controller and node 
public class InnerFxmlControl extends HBox implements Initializable { 
    @FXML public ComboBox cb; 

    public InnerFxmlControl() { 
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml_example2.fxml")); 
    fxmlLoader.setRoot(this); 
    fxmlLoader.setController(this); 
    try { 
     fxmlLoader.load();    
    } catch (IOException exception) { 
     throw new RuntimeException(exception); 
    } 
    } 

與未來FXML(註標籤fx:root):

<fx:root type="javafx.scene.layout.HBox" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
    <ComboBox fx:id="cb" /> 
    </children> 
</fx:root> 

通過這一點,你已經創建了一個新的控制,這您可以使用常規的JavaFX控件。例如。你的情況:

@FXML protected void handleSubmitButtonAction(ActionEvent event) { 
    // you just create new control, all fxml tricks are encapsulated 
    InnerFxmlControl root = new InnerFxmlControl(); 
    // and you can access all its' methods and fields including matched by @FXML tag: 
    root.cb.getItems().add("new item"); 

    Scene cc = buttonStatusText.getScene(); 
    cc.setRoot(root); 
    } 

和FXML:

<InnerFxmlControl /> 
+0

什麼root.cb. **分鐘** .getItems()。add(「new item」);和** cc ** .setRoot(root);在最後的代碼片? – 2012-05-23 11:37:03

+0

對不起,'分鐘'來自錯誤的複製粘貼。和來自維多利亞州原始代碼樣本的'cc'。更新。 – 2012-05-23 12:35:08

3

我使用1.7.0_21, 它現在這樣的代碼: 在主應用程序FXML文件,

<VBox ...> 
     <fx:include fx:id="tom" source="Tom.fxml" /> 
</VBox> 

和包含的fxml可以定義它自己的fxml文件,如下所示:

<AnchorPane id="AnchorPane" fx:id="tomPan" ... xmlns:fx="http://javafx.com/fxml" fx:controller="**com.tom.fx.TomController**"> 

,然後,在主應用程序位指示所需要的「Tom.fxml」的控制器是這樣的:

@FXML private TomController tomController; 

通知‘@FXML’。也許它會自動調用控制器。

+0

感謝您的貢獻!一個問題:fx:id是tom,但注入的控制器名爲tomController?他們通過什麼機制相關聯? – 2014-01-23 15:50:52

+0

JavaFX的注入「控制器」,以外匯:身份證。 – Marckaraujo 2016-12-13 16:59:00

+0

如果現在還不清楚,JavaFX的將自動注入控制器到名爲控制器領域。因此,如果FX:ID =「湯姆」,將注入控制器的一個實例到一個名爲tomController場。 – uesports135 2017-07-08 19:09:02

相關問題