【问题标题】:Switching scenes the FXML way (SceneBuilder)以 FXML 方式切换场景(SceneBuilder)
【发布时间】:2016-07-18 19:42:13
【问题描述】:

我有两个场景,场景 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);
      });

为格式化道歉!

我如何能够使用控制器类来做到这一点,我可以从中使用我的主类中声明的主要阶段和两个场景?

我希望它有意义

【问题讨论】:

    标签: javafx-8 scenebuilder


    【解决方案1】:

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

    我建议几件事:

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

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

    setVisible()
    setManaged()
    

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

    【讨论】:

    • Brill,感谢您抽出宝贵时间回答问题。我会在某个时候尝试这个,但我已经决定为我的任务编写 javaFX 方式,我将在提交后开始尝试 FXML 并试一试
    【解决方案2】:

    虽然我在技术上理解您想要实现的目标,但我仍然不知道背后的原因。

    如果您只想切换窗口的“主要”内容,请使用 StackPane 作为根,将多个布局添加到该堆栈,然后通过切换您要在 #toFront() 上工作的布局来解决您的问题。

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

    【讨论】:

    • 太好了。我一定会试一试的。谢谢
    • 如果这对您有用,请考虑对此进行投票。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    相关资源
    最近更新 更多