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