Mitchell Newcomb Mitchell Newcomb - 6 months ago 59
Java Question

I cannot seem to change scenes in javafx

So I'm trying to simply change between two scenes in javafx, but I've come into this re-occurring problem that I can't seem to fix. It is demonstrated in the following code:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.paint.Color;

public class TestApplication extends Application
{
private Stage stage;
private Scene scene, scene2;
public void start(Stage s)
{
scene=new Scene(new Group());
scene2=new Scene(new Group());

scene.setFill(Color.GREEN);
scene2.setFill(Color.ORANGE);

scene.setOnMouseClicked(e-> changeScene(scene2));
scene2.setOnMouseClicked(e-> changeScene(scene));

stage=s;
s.setScene(scene);
s.show();
}
public void changeScene(Scene nex)
{
stage.setScene(nex);
System.out.println("here");
}

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


Am I doing something wrong? How can I fix this?

Answer

What's going wrong

You are not placing anything in the scenes (just an empty group). By default scenes are (usually) going to size to the preferred size of their contained content. As your scenes have no content of any size, then the scenes shouldn't really have any size. I think the fact that the first scene even shows up is a bit of a quirk of the JavaFX system where it seems to set some default size to the initial scene when it can't work out any preferred size for the scene (just so that the initial window shows up).

How to fix it

To fix it, put some content in the enclosed scenes (and/or set the initial scene size in your scene constructors).

scene 1 scene 2

import javafx.application.Application;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.paint.Color;

public class TestApplication extends Application {
    private Stage stage;
    private Scene scene, scene2;

    public void start(Stage s) {
        scene = new Scene(new Group(new Label("1")), 200, 150);
        scene2 = new Scene(new Group(new Label("2")), 200, 150);

        scene.setFill(Color.GREEN);
        scene2.setFill(Color.ORANGE);

        scene.setOnMouseClicked(e -> changeScene(scene2));
        scene2.setOnMouseClicked(e -> changeScene(scene));

        stage = s;
        s.setScene(scene);
        s.show();
    }

    private void changeScene(Scene nex) {
        stage.setScene(nex);
    }

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