面向对象程序中的JavaFX切换场景

时间:2017-05-15 17:05:34

标签: java javafx

按下testButton后,我不知道如何切换场景。 Start方法不允许我对testStage执行任何操作。我的意思是我不能把它作为我的新主舞台或其他任何东西。

public class GUI extends Application
{

    public static void initialize(String[] args)
    {
        launch(args);
    }
    public static Stage testStage;

    @Override
    public void start(Stage mainStage) throws Exception
    {
        Scene scene = null;
        scene = GUIMainScene.setScene();

        mainStage.setScene(scene);
        mainStage.show();
    }

}

这是我的第二课,或者更确切地说来自这个课程的一些部分:

public class GUIMainScene
{

    public static Scene setScene()
    {
        setLabel();
        setButtons();
        setLayout();
        return new Scene(layout);
    }

    private static void setAddingButton()
{
    testButton.setText("Give us a dog");
    testButton = setButtonSize(testButton);
    testButton.setOnAction(e -> GUI.testStage.setScene(GUITestScene.setScene()));

}
}

1 个答案:

答案 0 :(得分:0)

有一些简单的解决方案,您可以传递primaryStage并更改其他类中的场景,或者传递场景并更改根节点,但我认为最好的方法是使用SimpleBooleanProperty / SimpleIntegerProperty。这允许您设置更改侦听器,并根据您可以控制从主类显示哪个gui而不传递任何内容。

示例:

public class GuiClass {

private SimpleBooleanProperty guiSwitch;

public GuiClass() {
    guiSwitch = new SimpleBooleanProperty(false);
}
public SimpleBooleanProperty getGuiSwitchProp() {
    return guiSwitch;
}
public StackPane getGui() {
    StackPane root = new StackPane();
    Button btn = new Button("Click me");     
    root.getChildren().add(btn);
    btn.setOnMouseClicked(ev -> setGuiSwitch(true));
    return root;
}
public void setGuiSwitch(Boolean value) {
    this.guiSwitch.set(value);
}
public boolean getGuiSwitch() {
    return this.guiSwitch.get();
}
}

然后在你的主要:

public class GUI extends Application
{

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

@Override
public void start(Stage mainStage) throws Exception
{
    GuiClass gui1 = new GuiClass();
    GuiClass gui2 = new GuiClass();

    gui1.getGuiSwitchProp().addListener(listener -> {
        if (gui1.getGuiSwitch()) {
            scene.setRoot(gui2.getGui());
            gui1.setGuiSwitch(false);
        }
    });
    gui2.getGuiSwitchProp().addListener(listener -> {
        if (gui2.getGuiSwitch()) {
            scene.setRoot(gui1.getGui());
            gui2.setGuiSwitch(false);
        }
    });

    Scene scene = new Scene(gui.getGui(), 300, 300);
    mainStage.setScene(scene);
    mainStage.show();
}

}

你可以在GuiClass中为按钮传递文本以查看它实际上是在改变,如果你想有更多选项来切换场景你可以使用SimpleIntegerProperty然后有0默认值,-1回去,1去在下一个等。