Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FX MVC多视图_Java_Javafx_Model View Controller - Fatal编程技术网

Java FX MVC多视图

Java FX MVC多视图,java,javafx,model-view-controller,Java,Javafx,Model View Controller,我正在使用JavaFX(类项目所需),我正在努力格式化我的MVC,以便能够将多个视图加载到舞台上(各种场景)。我有一个控制器,如下所示,它有两个View1实例 import javafx.application.Application; import javafx.stage.Stage; import javafx.animation.AnimationTimer; public class Controller extends Application { public int page

我正在使用JavaFX(类项目所需),我正在努力格式化我的MVC,以便能够将多个视图加载到舞台上(各种场景)。我有一个控制器,如下所示,它有两个View1实例

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.animation.AnimationTimer;

public class Controller extends Application {

public int page = 0;

private View1 view2;
private View1 view1;

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

@Override
public void start(Stage theStage) {
    view1 = new View1(theStage);
    view2 = new View1(theStage);
    new AnimationTimer() {
        public void handle(long currentNanoTime)
        {
            switch (page){
                case 0:
                    view1.update();
                    break;
                case 1:
                    view2.update();
                    break;
                default:
                    page = 0;
            }
            try {
                Thread.sleep(33);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }.start();
    theStage.show();
  }

}
问题出现在行
view2=newview1(舞台)。如果没有这一行,输出是一个带有背景图像的大画布。然而,有了这一行,就没有背景图像,它只是一块空白画布。下面是我的观点,我尽可能简化了它,只需一个背景图像来确定它是否正确加载。(为了保持简洁,我省略了导入内容,如果需要,我可以重新添加)


我不确定我是否正确处理了多个视图,我的意图是只处理多个场景,但我不确定如何构造它。

尝试以下结构(以下代码是一个文件mre。将其复制粘贴到
SwitchScene.java
并运行):

编辑:使用画布编辑一个版本的
View1

class View1 extends Group {

    public View1(String imagePath) {

        Image img = new Image(imagePath);
        Canvas canvas = new Canvas(img.getWidth(), img.getHeight());
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
        getChildren().add(canvas);
    }
}

非常感谢您的回复。我觉得这非常接近我所需要的,但是,鉴于我需要创建一个画布,我需要变量gc(GraphicsContext),这样我就可以用大量的项目填充屏幕。如果不经过舞台或现场观看,怎么能做到这一点呢?我很高兴这有帮助<代码>视图1
可以是任何
节点
。Fpr示例它可以是
窗格
。您可以使用
View1
扩展
节点
,并根据您的需要对其进行修改。我收到一个错误,在线程“JavaFX应用程序线程”java.lang.IllegalArgumentException中显示
异常:View2@7c69d5da[样式类=根]已经设置为另一个场景的根
我想这可能是因为我一直在实例化一个新场景,但我不确定。不清楚在什么上下文中。您正在尝试将同一根设置为两个场景吗?要获得更多帮助,请发布一个新问题并包括一个。感谢所有帮助,我将解决方案标记为正确,因为这是我所需要的。然而,第二张图片没有出现。它在空白屏幕和第一视图之间波动。
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;

public class SwitchScene extends Application {

    public int page = 0;

    @Override
    public void start(Stage theStage) {

        new Controller(theStage);
        theStage.show();
    }

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

class Controller {

    private final View1 view1,  view2;
    private final Stage stage;

    private static final String[] images = {
            "https://findicons.com/files/icons/345/summer/128/cake.png",
            "http://icons.iconarchive.com/icons/atyourservice/service-categories/128/Sweets-icon.png"
    };

    Controller(Stage stage) {
        this.stage = stage;
        view1 = new View1(images[0]);
        view2 = new View1(images[1]);
        swapScenes();
    }

    void swapScenes(){

        new AnimationTimer() {

            int page = 2;
            @Override
            public void handle(long currentNanoTime){
                switch (page){
                    case 2:
                        page = 1;
                        stage.setScene(new Scene(new Group(view1)));
                        break;
                    case 1:
                        page = 2;
                        stage.setScene(new Scene(new Group(view2)));
                        break;
                }

                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

class View1 extends ImageView {

    public View1(String imagePath) {
        super(imagePath);
    }
}
class View1 extends Group {

    public View1(String imagePath) {

        Image img = new Image(imagePath);
        Canvas canvas = new Canvas(img.getWidth(), img.getHeight());
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.drawImage(img, 0, 0, canvas.getWidth(), canvas.getHeight());
        getChildren().add(canvas);
    }
}