2014-12-13 60 views
1

我試圖在同一階段中切換場景。我是JavaFX的初學者,所以我不知道如何輕鬆做到這一點,沒有意大利麪代碼。當我在下面啓動代碼時,我在showCarChoosePage方法(第二場景)的rootLayout.setCenter(content)處得到空指針。我知道rootLayout爲空,我試圖創建新場景並將其加載到primaryStage,但我也得到了空指針。 showCarChoosePage方法從LoginController調用。感謝您的幫助如何在同一階段切換到新場景JavaFX

public class MC extends Application { 
    public Scene scene; 
    private GridPane grid; 
    public AnchorPane content; 
    public BorderPane rootLayout; 
    public Stage primaryStage; 

@Override 
public void start(Stage primaryStage) { 

    this.primaryStage = primaryStage; 
    this.primaryStage.setTitle("VMHT v0.1"); 

    try { 
     FXMLLoader loader = new FXMLLoader(MC.class.getResource("view/RootLayout.fxml")); 
     rootLayout = (BorderPane) loader.load(); 
     Scene scene = new Scene(rootLayout); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    showLoginPage(); 
    //showCarChoosePage(); 

} 
public void showLoginPage(){ 

    try { 
     FXMLLoader loader = new FXMLLoader(MC.class.getResource("view/LoginView.fxml")); 
     content = (AnchorPane) loader.load(); 
     rootLayout.setCenter(content); 

     LoginController controller = loader.getController(); 
     controller.setMC(this); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void showCarChoosePage(){ 

    try { 
     FXMLLoader loader = new FXMLLoader(MC.class.getResource("view/CarChooseView.fxml")); 
     AnchorPane content = (AnchorPane) loader.load(); 
     rootLayout.setCenter(content); 

     CarChooseController controller = loader.getController(); 
     controller.setMC(this); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public static void main(String[] args) { 
    launch(args); 
} 

}

回答

-1

這裏有一個簡單的方法,你可以嘗試

import javafx.stage.Stage; 

public class ManyScenes extends Application { 

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

@Override 
public void start(final Stage primaryStage) { 
    primaryStage.setTitle("Hello World"); 

    Group root1 = new Group(); 
    Group root2 = new Group(); 
    Group root3 = new Group(); 

    final Scene scene1 = new Scene(root1, 300, 250); 
    final Scene scene2 = new Scene(root2, 300, 250); 
    final Scene scene3 = new Scene(root3, 300, 250); 

    Button go1 = new Button(); 
    go1.setLayoutX(100); 
    go1.setLayoutY(80); 
    go1.setText("Go to scene2"); 
    go1.setOnAction(new EventHandler<ActionEvent>() { 

     public void handle(ActionEvent event) { 
      primaryStage.setScene(scene2); 
     } 
    }); 
    root1.getChildren().addAll(new Label("Scene 1"), go1); 

    Button go2 = new Button(); 
    go2.setLayoutX(100); 
    go2.setLayoutY(80); 
    go2.setText("Go to scene3"); 
    go2.setOnAction(new EventHandler<ActionEvent>() { 

     public void handle(ActionEvent event) { 
      primaryStage.setScene(scene3); 
     } 
    }); 

    root2.getChildren().addAll(new TextField(), go2); 

    Button go3 = new Button(); 
    go3.setLayoutX(100); 
    go3.setLayoutY(80); 
    go3.setText("Back to scene1"); 
    go3.setOnAction(new EventHandler<ActionEvent>() { 

     public void handle(ActionEvent event) { 
      primaryStage.setScene(scene1); 
     } 
    }); 

    root3.getChildren().addAll(new TextArea(), go3); 

    primaryStage.setScene(scene1); 
    primaryStage.show(); 
    } 
} 
0

這裏是另一種方式來處理多個場景。它爲每個場景使用控制器。您必須將Main中創建的初始階段傳遞給每個新控制器。您還必須將想要共享的任何數據從控制器傳遞到控制器。這全部通過添加到控制器的方法完成。

在這個簡單的例子中,一個Person對象是使用name,sex和age類變量以及這些對象的setter和getters創建的。

然後我創建了3個顯示名稱,性別和年齡值的fxml文件(使用SceneBuilder)。當然,我還創建了3個控制器,每個fxml文件一個。

用戶被允許編輯這些值。一個場景允許輸入姓名,另一個允許輸入性別,最後允許年齡輸入。這模擬了一個複雜的應用程序,其中數據輸入和處理分爲3個不同的場景。

三個fxml文件和3個控制器看起來非常相似。這是NameController。它首先爲Stage和Person對象設置了setter。它還具有按鈕事件處理程序以允許用戶導航到其他階段。

package multiscene; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.AnchorPane; 
import javafx.stage.Stage; 

import java.net.URL; 
import java.util.ResourceBundle; 

public class NameController implements Initializable { 

    @FXML private TextField lblSex; 
    @FXML private TextField lblAge; 
    @FXML private TextField txtName; 
    private Stage myStage; 
    private Person person; 

    public void setStage(Stage myStage) { 
     this.myStage = myStage; 
    } 

    public void setPerson(Person person) { 
     this.person = person; 
     lblAge.setText(person.getAge()); 
     txtName.setText(person.getName()); 
     lblSex.setText(person.getSex()); 
    } 

    @FXML 
    private void ageClicked(ActionEvent event) throws Exception{ 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(NameController.class.getResource("Age.fxml")); 
     AnchorPane page = (AnchorPane) loader.load(); 
     Stage dialogStage = new Stage(); 
     dialogStage.setTitle("Person Editor"); 
     // dialogStage.initModality(Modality.WINDOW_MODAL); 
     //dialogStage.initOwner(primaryStage); 
     Scene scene = new Scene(page); 
     dialogStage.setScene(scene); 

     // Set the person into the controller 
     person.setName(txtName.getText()); 
     AgeController newController = loader.getController(); 
     newController.setStage(dialogStage); 
     newController.setPerson(person); 
     dialogStage.show(); 
     myStage.close(); 
    } 

    @FXML 
    private void sexClicked(ActionEvent event) throws Exception { 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(AgeController.class.getResource("Sex.fxml")); 
     AnchorPane page = (AnchorPane) loader.load(); 
     Stage dialogStage = new Stage(); 
     dialogStage.setTitle("Person Editor"); 
     // dialogStage.initModality(Modality.WINDOW_MODAL); 
     //dialogStage.initOwner(primaryStage); 
     Scene scene = new Scene(page); 
     dialogStage.setScene(scene); 

     // Set the person into the controller 
     person.setName(txtName.getText()); 
     SexController newController = loader.getController(); 
     newController.setStage(dialogStage); 
     newController.setPerson(person); 
     dialogStage.show(); 
     myStage.close(); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 

} 

Main.java必須初始化舞臺和共享數據,如下所示。加載時,Stage和共享數據都會傳遞到第一個場景。

package multiscene; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Scene; 
import javafx.scene.layout.AnchorPane; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     Person person = new Person(); 
     FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(Main.class.getResource("Name.fxml")); 
     AnchorPane page = (AnchorPane) loader.load(); 
     Stage dialogStage = new Stage(); 
     dialogStage.setTitle("Person Editor"); 
     Scene scene = new Scene(page); 
     dialogStage.setScene(scene); 
     NameController nameController = loader.getController(); 
     nameController.setStage(dialogStage); 
     nameController.setPerson(person); 
     dialogStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}