2014-01-19 4 views
7

私はこのプロジェクトではNetBeansのJavaFXライブラリと連携してSceneBuilderを使用しています。私はScenebuilderを使ってコントローラクラス用のfxmlとnetbeansを作成します。目標は、展開されるかなり複雑なアプリケーションを構築することです。実行中のJavaFXアプリケーションでは、独自の別のコントローラクラスを持つ新しいウィンドウを開きます

私はJavaFXアプリケーションを起動して、コントローラークラスを接続することができます。しかし、新しいウィンドウを開こうとすると、コントローラクラスを新しいウィンドウにバインドすることはできません。物事をシンプルに保つために、複雑なバックエンドのために新しいウィンドウ用に別のコントローラクラスを用意したいと思っています。

TL; DR - コントローラークラスを使用してJavaFXアプリケーションで新しいウィンドウを開こうとしています。コントローラクラスはバインドされていません。

モデルクラス以下

コードサンプル - メインアプリケーション

Sample.javaためFXMLファイル - -

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アプリケーションを起動するためのラッパーは、初期化可能に延びていますは、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というタイトルの新しいウィンドウを開こうとするコードスニペットです - 私は問題を抱えている場所です初期化可能

を実装して、私は単純に同じfxidで変数を宣言することはできません。

ServerConfigChooserクラス内のコンストラクタの理由は、initialize()メソッドを自動的に起動できないためです。私は、.fxmlファイル内の変数として、初期化メソッドを呼び出すことができません。コンストラクタ内で手動で起動します。

すべてのソリューションは大歓迎です!

+0

JavaFXのは今のために行う必要があります.fxmlと競合します。うまくいけばメモリリークは近い将来に修正される – Kyte

+3

賢明な言葉。日曜日の質問を投稿することは、一般的にSOの週の中で最も活動的ではありません。よりよい結果のために月曜日を待ちます – jth41

+0

私はjth41に同意します – nate

答えて

8

FXMLをそのように2回ロードしないでください。同じ.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ドキュメントはfxroot構造を使用する必要があります。this doc(シーンビルダーでこれを設定できます)

  • fxmlルート要素からコントローラを削除する必要があります。これは、例えば、コントローラクラス

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

    FXMLLoaderクラス

を使用して、この道であり、

<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">

2

おそらく、ServerConfigChooserをロードする方法があります(FXMLが2回ロードされたような感じがします)。動作するはずです以下:(実際には試していませんが、競合する可能性)

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.fxmlfx:controllerを指定しないないことを確認してください。

関連する問題