当前位置: 首页 > 知识库问答 >
问题:

如何在同一阶段切换到新场景JavaFX

魏誉
2023-03-14
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个答案

章光华
2023-03-14

这里有另一种处理多场景的方法。它为每个场景使用控制器。您必须将在Main中创建的初始阶段传递给每个新控制器。您还必须在控制器之间传递您想要共享的任何数据。这都是通过添加到控制器中的方法来完成的。

在这个简单的例子中,创建了一个Person对象,其中包含name、sex和age类变量以及这些对象的setter和getter。

然后我创建了3个fxml文件(使用SceneBuilder),这些文件显示了姓名、性别和年龄值。当然,我还创建了3个控制器,每个fxml文件一个。

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
    }

}  
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);
    }
}
 类似资料:
  • 我看了很多页,试图找出如何切换场景,但都没有成功。 我有一个计算器,我的目标是选择一个菜单选项来更改计算器(即:基础和科学)。现在我只是在测试,所以这里是我到目前为止与这个问题相关的代码(我使用的是场景生成器): 编辑我已经尝试了很多东西。不管怎样,我总是得到这个NullPointerException。我有一种感觉,这可能与在场景生成器中设置某些内容有关,但我就是找不到答案 工作代码: 我使用下

  • 我在Internet上到处找了找,但我没有找到这个简单问题的直接答案:在JavaFX应用程序中切换场景的最佳方法是什么?我有几个FXML文件和控制器,每一个,我希望能够在他们之间切换尽可能快(屏幕大小应该保持不变,所有关于窗口应该保持不变,除了内容)。 我可以考虑多种方法,最常见的方法是用FXMLLoader加载FXML文件,然后创建一个新场景,然后将这个场景设置为舞台,最后显示舞台。这是可行的,

  • 当我运行该程序时,它加载第一个和第二个fxml,但继续显示第一个fxml(当它应该显示第二个时)。我可以使用相同代码的输入(即按钮)从第一个屏幕到第二个屏幕。 我尝试使用不同的加载器,每次设置场景时都使用。show()方法,但这些(或它们的许多变体)都不起作用。 我在调用方法时进行打印--这就是我确定它们被加载的方式(printline): null 相反,输出(在调试中,如果stage.show

  • 开始一个新游戏,改变关卡,或结束游戏时,为了给用户不同的效果呈现,大多需要切换不同的场景。Cocos2d-x 提供了一系列方式去做这件事情 场景切换。 场景切换的方式 有很多场景切换的方式,每种都有特定的方法,让我们来看看: auto myScene = Scene::create(); runWithScene() 用于开始游戏,加载第一个场景。只用于第一个场景! Director::getI