2012-10-21 94 views
13

我正在使用Netbeans 7.2與Scene Builder 1.0開發JavaFX應用程序。我有我的主屏幕設置,我想要它,所以我點擊一個按鈕,它會關閉主窗口,並打開另一個。主Stage對象位於主類中,但控制器類是單獨的,並且由於它不是靜態的並且處於不同的類中,因此無法訪問它。我該如何改變場景或舞臺?JavaFX如何更改舞臺

回答

33

Download JavaFX samples找到項目FXML-LoginDemo,這就是你需要的。對於快速參考我在這裏複製粘貼主要的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

現在這是否正確?我的意思是,我可以使用它並在App類之外調用.replaceSceneContent?或今天(2015年)是否有正確的方法來進行階段之間的轉換?謝謝=) – user2582318

2

你也一樣可以做到這樣:

修改您的controller.java這樣

Stage thisStage; 

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

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

重要的是,您不要在初始化方法中使用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)。

裏面的LoginController.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對於JavaFX,使用最簡單的推送和解除視圖。

讓我與社區共享代碼:https://github.com/jalopezsuarez/javafx-screens

的想法,是有一個非常非常簡單的環境,幫助您的屏幕之間切換。

希望它可以幫助你。