【问题标题】:JavaFX, Open a Screen in same WindowJavaFX,在同一个窗口中打开一个屏幕
【发布时间】:2014-03-19 12:07:21
【问题描述】:

我正在尝试实现一个具有简单导航的应用程序。一个主菜单,3 个子菜单,每个菜单又有 3 个子菜单。

我需要应用程序在主菜单作为根屏幕的同一窗口中递归地打开每个子菜单。我必须能够通过每个子菜单上的“返回”按钮返回该菜单。

我为每个(!)菜单和子菜单实现了一个主类、一个控制器类和一个 FXML 文件。

例如我的主菜单

      package application;

import org.apache.log4j.Logger;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;

public class Main extends Application {

    // Initialize Logger
    private static final Logger logger = Logger.getLogger(Main.class);

    @Override
    public void start(Stage primaryStage)
    {
        try
        {
            AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("MainFrame.fxml"));
            Scene scene = new Scene(root,1000,500);

            primaryStage.setScene(scene);
            primaryStage.show();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args)
    {
        logger.info("Starting application.");
        launch(args);
    }
}

我的主控制器

    package application;

import org.apache.log4j.Logger;


import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class MainFrameController
{

    private static final Logger logger = Logger.getLogger(MainFrameController.class);

    @FXML
    private Button btn_random1;
    @FXML
    private Button btn_random2;
    @FXML
    private Button btn_random3;
    @FXML
    private Button btn_random4;

    public void initialize()
    {
        //mainService = new MainService();
    }

    @FXML
    private void onRandomButton1() throws Exception
    {
        logger.info("onRandomButton1Clicked");

        Stage stage = new Stage();
        AnchorPane root;
        root = (AnchorPane)FXMLLoader.load(getClass().getResource("RandomFXML1.fxml"));
        Scene scene = new Scene(root,1000,500);
        stage.setScene(scene);
        stage.show();
    }

    @FXML
    private void onRandomButton2()
    {
        logger.info("onRandomButton1");
    }

    @FXML
    private void onRandomButton3()
    {
        logger.info("onRandomButton2");

    }
    @FXML
    private void onRandomButton4()
    {
        Platform.exit();
        logger.info("onRandomButton3");
    }
}

有没有办法简单地更改我的代码,让它在同一个窗口中打开?

我看了几个教程,解决这个问题的方法相对复杂,我想坚持我的代码,不要改变太多,否则我必须重新开始。

请注意,这只是许多 Main/Controller/FXML 组合之一,我有大约 10 个屏幕和“子屏幕”,它们正在像这样导航(通过 java 打开一个新窗口)。

任何人的想法?或者可能是一个相对简单的教程(我不必更改整个代码)?

谢谢!

【问题讨论】:

    标签: java controller javafx stage scene


    【解决方案1】:

    在根目录有一个空控制器(或者可能有一个空锚窗格)并让它打开其他控制器并将其添加到当前窗格?

    我目前有一个类似的设置,但有一个选项卡窗格:每个模块都加载到一个单独的选项卡中。每个模块本身都有一个 fxml 文件、一个控制器等。核心代码为每个模块动态创建新的选项卡等并加载它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多