簡體   English   中英

使用正在運行的JavaFX應用程序,使用自己獨立的控制器類打開一個新窗口

[英]With a running JavaFX application, open a new window with its own, separate controller class

我正在將SceneBuilder與Netbeans的JavaFX庫結合使用。 我使用Scenebuilder為控制器類創建fxml和netbeans。 目標是構建一個相當復雜的應用程序。

我可以啟動一個JavaFX應用程序並連接控制器類就好了。 但是,當我嘗試打開一個新窗口時,我似乎無法將控制器類綁定到新窗口。 為了簡單起見,我希望新窗口有一個單獨的控制器類,因為后端很復雜。

TL; DR - 嘗試使用控制器類在JavaFX應用程序上打開一個新窗口。 控制器類沒有綁定。

代碼示例如下

模型類 - 用於啟動應用程序的包裝器

public class Model extends Application{
    public static void main(String[] args){
         Application.launch(Model.class, args);
    }
    @Override
    public void start(Stage stage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
        stage.setScene(new Scene(root));
        stage.show();
    }
}

Sample.fxml - 主應用程序的fxml文件

Sample.java - extends Initializable,是Sample.fxml的控制器類。 下面是我嘗試打開標題為“ServerConfigChooser”的新窗口的代碼片段

try{
    Parent root = FXMLLoader.load(getClass().getResource("ServerConfigChooser.fxml"));
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
    ServerConfigChooser controller = new ServerConfigChooser();

    loader.setController(controller);
    loader.setRoot(root);

    Stage stage = new Stage();
    stage.setScene(new Scene(root));
    stage.show();
} catch (IOException ex)

ServerConfigChooser.java - 實現Initializable

這就是我遇到問題的地方。 我不能簡單地使用與.fxml文件中的變量相同的fxid聲明變量。 調用類時,不會觸發initialize()方法。

ServerConfigChooser類中構造函數的原因是我無法自動觸發initialize()方法。 我在構造函數中手動觸發。

歡迎任何解決方案!

不要像這樣加載FXML兩次。 您可以加載多次相同的.fxml文檔(多個場景圖/控制器),但如果您想一起加載場景圖並初始化控制器,則必須只調用一次fxml加載器。

這是一個例子

    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
    ServerConfigChooser controller = new ServerConfigChooser();
    loader.setController(controller);
    loader.setRoot(controller);
    Parent root;
    try {
        root = (Parent) loader.load();
        Scene scene = new Scene(root, 320, 200);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();
    } catch (IOException ex) {
        Logger.getLogger(ServerConfigChooser.class.getName()).log(Level.SEVERE, null, ex);
    }

注意

  • 您的控制器應該擴展.fxml文檔的根節點的節點類型
  • 您的.fxml文檔應該使用fxroot構造,請參閱此文檔 (您可以在場景構建器中設置此文檔
  • 你應該從fxml根元素中刪除控制器。 它將與使用FXMLLoader類的這種方式沖突

例如控制器類

public class ServerConfigChooser extends AnchorPane implements Initializable {
   ...
}

和.fxml

<fx:root type="javafx.scene.layout.AnchorPane" id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">

這里的問題可能是你如何加載ServerConfigChooser (我覺得FXML加載兩次或類似的東西)。 以下應該有效:

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
    ServerConfigChooser controller = new ServerConfigChooser();
    loader.setController(controller);
    Parent root = (Parent) loader.load();

    Stage stage = new Stage();
    stage.setScene(new Scene(root));
    stage.show();
}
catch(...) {...}

另請檢查您是否在ServerConfigChooser.fxml 指定fx:controller (可能會發生沖突,尚未嘗試過)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM