用FXML方式切换场景(SceneBuilder)

时间:2016-03-30 16:49:13

标签: javafx-8 scenebuilder

我有两个场景,场景1上面有一个标签,上面写着“这就是场景1”,它上面还有一个带有“按我转到场景2”文本的按钮。场景2类似于场景1,但场景2上的标签和文字则相反。

问题很简单,或者至少应该是。我能够以javaFX方式执行此操作,但似乎无法以FXML方式执行此操作。

我有一个主要的课程 -

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class ManinApp extends Application
{
Stage primaryStage;
private AnchorPane rootLayout;

public static void main(String [] args)
{
    launch(args);
}
public void start(Stage primaryStage)
{
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("Two Scenes");

    initRootLayout();
    //showSecondScene();
}
public void initRootLayout()
{
    try
    {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(ManinApp.class.getResource("Scene1.fxml"));
        rootLayout = (AnchorPane) loader.load();

        Scene scene = new Scene(rootLayout);
        primaryStage.setScene(scene);
        primaryStage.show();

    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}
/**
public void showSecondScene()
{
    try
    {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(ManinApp.class.getResource("Scene2.fxml"));
        AnchorPane secondScene = (AnchorPane)loader.load();
        rootLayout.getChildren().add(secondScene);



    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}
*/
public Stage getPrimaryStage()
{
    return primaryStage;
}

}

showSecondScene()目前已被注释掉了。我的理解是你还需要一个Controller类来将代码连接到SceneBuilder?

FX方式的解决方案

         btnscene1.setOnAction(e ->
            {
        if(e.getSource() == btnscene1)
            thestage.setScene(scene2);
        else
            thestage.setScene(scene1);

            });
        btnscene2.setOnAction(e ->
           {
       if(e.getSource()==btnscene2)
        thestage.setScene(scene1);
        else
           thestage.setScene(scene2);
      });

格式化道歉!

我如何使用控制器类来执行此操作,从中我可以使用主阶段和我的主类中声明的两个场景?

我希望它有意义

2 个答案:

答案 0 :(得分:1)

我认为你做得很好。 FXML(和SceneBuilder)在这里使用正确。

我会建议一些事情:

  • 使用根容器(例如StackPane)来托管scene1或scene2 (更好的名称将是layout1 / layout2)。你不需要使用 不同的场景在这里。
  • 在初始时加载两个fxml文件(如果需要,可以延迟加载)
  • 通过删除根容器的内容并添加另一个容器来从一个切换到另一个。

现在,如果布局很大,涉及很多css,并且您需要经常从layout1切换到layout2,您可能希望在根容器中添加两个布局。然后,使用:

setVisible()
setManaged()

...在要隐藏/显示的布局的根目录上。 这样做,您可以避免在场景图中添加节点后立即执行的布局和CSS步骤。

答案 1 :(得分:0)

虽然我在技术上理解了你想要实现的目标,但我仍然对其背后的原因感到失望。

如果您只想切换" main"窗口的内容,使用StackPane作为根,向该堆栈添加多个布局,并通过切换您想要在#toFront()上工作的那个来解决您的问题。

通常情况下,堆栈上的布局是透明的(当然除了按钮之类的控件等),因此您需要设置堆叠布局的背景 OR (我更喜欢)切换后面一个的可见性(或将opaqueness设置为0,或类似的东西)。