2012-10-21 30 views
13

Sto usando Netbeans 7.2 con Scene Builder 1.0 per sviluppare un'applicazione JavaFX. Ho il mio schermo principale configurato e voglio averlo, quindi faccio clic su un pulsante e chiuderò la finestra principale e ne aprirò un'altra. L'oggetto Stage principale si trova nella classe principale, ma la classe controller è separata e non può accedervi poiché non è statica e in una classe diversa. Come cambio la scena o il palco?JavaFX come cambiare fase

risposta

33

Download JavaFX samples trovare il progetto FXML-LoginDemo, questo è quello che ti serve. Per avere un riferimento resoconto che sto copia incolla classe Java principale qui;)

/* 
* 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

Grazie, questo è esattamente quello che stavo cercando! –

+4

collegamento interrotto aggiornato :) – invariant

+1

è correttamente ora? Voglio dire, posso usare questo e chiamare al di fuori della classe App il .replaceSceneContent? o oggi (anno 2015) c'è un modo corretto di fare il cambio tra le fasi? grazie =) – user2582318

2

si può fare in questo modo anche:

Modificare la controller.java questo modo

Stage thisStage; 

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

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

E 'importante che non usi thisStage nel metodo di inizializzazione.

Modificare la Mainclass in questo modo:

@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(); 
} 

È possibile scaricare un esempio di Projekt (NetBeans) here.

+0

è rotto, puoi darlo come un altro? – ConquerorsHaki

2

Probabilmente sto dicendo qualcosa di simile qui, ma questo è come lo faccio:

(In questo esempio, sto transizione da Login.fxml a Home.fxml).

All'interno della classe LoginController.fxml, ho creato il seguente metodo:

@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"); 
    } 
} 

e basta .;)

2

Sulla base della sua domanda, di recente stavo lavorando sullo sviluppo di un iOS equivalente navigationController per JavaFX, utilizzando l'idea più semplice di visualizzazione push e respingi.

vorrei condividere il codice con la comunità: https://github.com/jalopezsuarez/javafx-screens

L'idea, è quella di avere un ambiente molto molto facile per aiutarvi a cambiare tra le schermate.

Spero che ti aiuti.

Problemi correlati