Java FX MVC несколько представлений - PullRequest
1 голос
/ 07 ноября 2019

Я использую Java FX (Требуется для проекта класса), и я изо всех сил стараюсь отформатировать свой MVC, чтобы я мог загрузить несколько представлений на сцену (различные сцены). У меня есть контроллер, как показано ниже, который имеет 2 экземпляра 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 = new View1(theStage);. Без этой строки на выходе получается большой холст с фоновым изображением. Однако с этой строкой нет фонового изображения, это просто пустой холст. Ниже мой вид. Я максимально упростил его, только одно фоновое изображение, чтобы определить, правильно ли он загружен. (Я упустил импорт, чтобы сделать его кратким, при необходимости я могу добавить их обратно)

public class View1 {
Stage theStage;
Group root;
Scene theScene;
Canvas canvas;

// value of the height and width of screen
int canvasWidth = 1000;
int canvasHeight = 800; 

GraphicsContext gc;

Image background;

//View1 constructor initialize the starting position for the image
//Called in controller
public View1(Stage theStage) {


    this.theStage = theStage;
    this.theStage.setTitle("Estuary Game");

    root = new Group();
    theScene = new Scene(root);
    this.theStage.setScene(theScene);

    canvas = new Canvas(canvasWidth, canvasHeight);
    root.getChildren().add(canvas);
    gc = canvas.getGraphicsContext2D();

    background = createImage("assets/mini-game-1.png");
}

//Read image from file and return
private Image createImage(String image_file) {
    Image img = new Image(image_file);
    return img;
}

//method used to repaint on the image and called in controller
public void update() {
    // draw background and sharkMove such like current
    gc.drawImage(background, 0, 0);

}

}

Я не уверен, что правильно работаю с несколькими представлениями, мои намерения состоят в том, чтобы просто иметь несколькосцены, но я не был уверен, как это структурировать. Любая помощь будет оценена.

1 Ответ

1 голос
/ 08 ноября 2019

Попробуйте следующую структуру (следующий код представляет собой файл с одним файлом. Скопируйте и вставьте его в SwitchScene.java и запустите):

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);
    }
}

Редактировать: версия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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...