2012-10-21 19 views
13

私は、JavaBeansアプリケーションを開発するために、Scene Builder 1.0でNetbeans 7.2を使用しています。メイン画面を設定しておきたいので、ボタンをクリックするとメインウィンドウが閉じて別のウィンドウが開きます。メインのStageオブジェクトはメインクラスにありますが、コントローラークラスは独立しており、静的ではなく異なるクラスにあるため、アクセスできません。どのようにシーンやステージを変更するのですか?JavaFXステージの変更方法

答えて

33

Download JavaFX samplesプロジェクトFXML-LoginDemoを見つけると、それが必要です。それはすることが重要である

このよう

Stage thisStage; 

public void setStage (Stage stage){ 
    thisStage = stage; 
} 

public void showStage(){ 
    thisStage.setTitle("Titel in der MainController.java geändert"); 
    thisStage.show(); 
} 

あなたcontroller.javaを変更します。あなたはそれをあまりにもこの方法を行うことができます)

/* 
* Copyright (c) 2008, 2011 Oracle and/or its affiliates. 
* All rights reserved. Use is subject to license terms. 
* 
* This file is available and licensed under the following license: 
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions 
* are met: 
* 
* - Redistributions of source code must retain the above copyright 
* notice, this list of conditions and the following disclaimer. 
* - Redistributions in binary form must reproduce the above copyright 
* notice, this list of conditions and the following disclaimer in 
* the documentation and/or other materials provided with the distribution. 
* - Neither the name of Oracle Corporation nor the names of its 
* contributors may be used to endorse or promote products derived 
* from this software without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/ 
package demo; 

import demo.model.User; 
import demo.security.Authenticator; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.JavaFXBuilderFactory; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

/** 
* Main Application. This class handles navigation and user session. 
*/ 
public class App extends Application { 
    private Stage stage; 
    private User loggedUser; 

    private static App instance; 

    public App() { 
     instance = this; 
    } 

    public static App getInstance() { 
     return instance; 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override public void start(Stage primaryStage) { 
     try { 
      stage = primaryStage; 
      gotoLogin(); 
      primaryStage.show(); 
     } catch (Exception ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public User getLoggedUser() { 
     return loggedUser; 
    } 

    public boolean userLogging(String userId, String password){ 
     if (Authenticator.validate(userId, password)) { 
      loggedUser = User.of(userId); 
      gotoProfile(); 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void userLogout(){ 
     loggedUser = null; 
     gotoLogin(); 
    } 

    private void gotoProfile() { 
     try { 
      replaceSceneContent("profile.fxml"); 
     } catch (Exception ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void gotoLogin() { 
     try { 
      replaceSceneContent("login.fxml"); 
     } catch (Exception ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private Parent replaceSceneContent(String fxml) throws Exception { 
     Parent page = (Parent) FXMLLoader.load(App.class.getResource(fxml), null, new JavaFXBuilderFactory()); 
     Scene scene = stage.getScene(); 
     if (scene == null) { 
      scene = new Scene(page, 700, 450); 
      scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm()); 
      stage.setScene(scene); 
     } else { 
      stage.getScene().setRoot(page); 
     } 
     stage.sizeToScene(); 
     return page; 
    } 
} 
+0

ありがとう、これは私が探していたものです! –

+4

更新された壊れたリンク:) – invariant

+1

これは正しくnowdaysですか?私はこれを使用してAppクラスの外で.replaceSceneContentを呼び出すことができますか?または今日(2015年)ステージ間で変更を行う正しい方法がありますか?ありがとう=) – user2582318

2

は、クイックリファレンスのために私はここでの主なJavaクラスを貼り付けるコピーしています初期化メソッドでthisStageを使用しないでください。

はあなたMainclassをこのように変更します。

@Override 
public void start(Stage stage) throws Exception { 
    URL location = getClass().getResource("Main.fxml"); 
    FXMLLoader fxmlLoader = new FXMLLoader(); 
    fxmlLoader.setLocation(location); 
    fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory()); 
    Parent root = (Parent) fxmlLoader.load(location.openStream()); 
    Scene scene = new Scene(root); 
    stage.setScene(scene); 
    MainController mainController = fxmlLoader.getController(); 
    mainController.setStage(stage); 
    mainController.showStage(); 
} 

あなたは例のPROJEKT(NetBeansの)hereをダウンロードすることができます。

+0

リンクが壊れている、別のものとして与えることができますか? – ConquerorsHaki

2

私はおそらくここに似た何かを言っているが、これは、私はそれを行う方法です。

(この例では、私はLogin.fxmlからHome.fxmlに移行しています)。あなたの質問に基づいて.;

@FXML 
private void login(javafx.event.ActionEvent event) throws IOException 
{ 
    if(pwf1.getText().equals("dolphin")) 
    { 
      Parent blah = FXMLLoader.load(getClass().getResource("Home.fxml")); 
      Scene scene = new Scene(blah); 
      Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow(); 
      appStage.setScene(scene); 
      appStage.show(); 
    } 
    else 
    { 
      label1.setText("Password is incorrect. Please Try Again"); 
    } 
} 

そして、それはそれだ)

2

、最近、私はiOSの同等NavigationControllerの開発に取り組んでいた:

LoginController.fxmlクラスの中では、私は次のメソッドを作成しましたJavaFXの場合、ビューのプッシュおよびディスプレイの最も単純な考え方を使用します。

私はコミュニティでコードを共有しましょう:https://github.com/jalopezsuarez/javafx-screens

アイデアは、あなたが画面間で変更するのに役立つ非常に非常に簡単な環境を持つことです。

お手伝いします。

関連する問題