程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了JavaFX多场景开启,场景复制大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决JavaFX多场景开启,场景复制?

开发过程中遇到JavaFX多场景开启,场景复制的问题如何解决?下面主要结合日常开发的经验,给出你关于JavaFX多场景开启,场景复制的解决方法建议,希望对你解决JavaFX多场景开启,场景复制有所启发或帮助;

我想要一个登录页面(我有工作),然后进入一个新场景(我还没有工作)。

然后我希望这个场景有你可以点击的项目。每个项目打开另一个场景/窗口。但是您可以根据需要打开任意数量。它们包含不同的数据,但相同的 fxml/scene。

这可能吗?

JavaFX多场景开启,场景复制

解决方法

是的,这是可能的。它需要您为场景创建一个控制器,然后为该场景的每个新实例创建该控制器对象的新实例。我认为它也需要每次都通过一个新阶段。

编辑: 未能为场景的每个新实例创建新的控制器实例意味着有可能从另一个窗口中的打开场景覆盖一个窗口中打开场景中的数据窗口。

如果您不熟悉 JavaFX,我将提供一些创建新视图的示例。这个问题主要是关于这样做的方法。

假设您遵循 MVC 模式,您的项目的结构可能类似于:

编辑:更正了 FXMLLoader 的不当使用

@H_404_2@mainApp.java

import java.io.IOException;

import javafx.application.Application;

import javafx.fxml.FXMLLoader;

import javafx.stage.Modality;
import javafx.stage.Stage;

import Controller.LoginController;

public class Main
        extends Application
{

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

    @Override
    public void start(Stage stagE) throws Exception
    {
        try {

            FXMLLoader loader = new FXMLLoader(Main.class.getresource("/View/Login.fxml"));
            Parent     root   = loader.load();

            stage.setScene(new Scene(root));

            LoginController loginController = loader.getController();

            // Pass this stage by calling the controller's stage setter.
            // Conversely we could call a singleton class here to
            // give us a stage object that we can re-use many times 
            loginController.setStage(stagE);

            stage.initStyle(StageStyle.UNIFIED);

            stage.setResizable(false);
            stage.getIcons().add(new Image("resources/icon.png"));
            stage.settitle("");

            stage.centerOnScreen();
            stage.show();

        } catch (IOException eX) {
            // exception handling
        }
    }
}

登录控制器.java

import java.net.URL;

import java.io.IOException;

import java.util.resourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;

import javafx.event.EventHandler;

import javafx.scene.control.button;

import javafx.stage.Modality;
import javafx.stage.Stage;

import Controller.MainController;

public class LoginController implements Initializable
{
    @FXML
    private Button loginButton;
    private Stage stage;

    public LoginController() {}

    @Override
    public void initialize(URL url,resourceBundle rb) {
    
        loginButton.addEventHandler(MouseEvent.MOUSE_CLICKED,(E) -> {
            doLogin();
        });
    }

    @FXML
    private void doLogin() {
    
        // handle login
        
        showMainApplicationView();
    
    }

    @FXML
    private void showMainApplicationView() {
        
        try {

        loader = new FXMLLoader(LoginController.class.getresource("View/mainView.fxml"));

        Parent         root           = (Parent) loader.load();
        MainController mainController = new MainController();

        loader.setController(mainController);

        mainController.setStage(new Stage());

        stage.initModality(m);
        stage.setResizable(isResizablE);
        stage.getIcons().add(new Image("resources/icon.png"));
        stage.settitle(titlE);
        stage.setScene(new Scene(root));

        return stage;
        } catch (IOException E) {

            // exception handling

        }
    }

    @FXML
    public void setStage(Stage stagE) {
    
        this.stage = stage;

    }

}

@H_404_2@mainController.java

import java.net.URL;

import java.util.resourceBundle;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;

import javafx.stage.Stage;

public class LoginController implements Initializable
{

    public LoginController() {}

    @Override
    public void initialize(URL url,resourceBundle rb) {}


    @FXML
    private void showSubview() {
        /* Same code as the prior examples for launching a new view
         * It will work for creaTing as many new "windows" of the same
         * view as you desire. If you need to pass different types of
         * data to each view you can use a DAO model,or some kind of
         * "Instance" object that works for sending/receiving data to/from
         * the subview from this class.
         */

    }

    @FXML
    public void setStage(Stage stagE) {
    
        this.stage = stage;

    }

}

如果您想多次重复使用一个舞台并以不同的深度进入子视图,我建议使用 Singleton 类。

StageHolder.java

import javafx.stage.Stage;

public final StageHolder
{
    private Stage stage;
    
    private final static StageHolder INSTANCE = new StageHolder();

    private StageHolder() {}

    public static StageHolder geTinstance() {

        return INSTANCE;
    }

    public Stage getStage() {

        return this.stage;
    }

    // you can omit this setter if you only want to re-use a single stage over and over.
    public void setStage(Stage stagE) {

        this.stage = stage;

    }
}

大佬总结

以上是大佬教程为你收集整理的JavaFX多场景开启,场景复制全部内容,希望文章能够帮你解决JavaFX多场景开启,场景复制所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。