Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:在UI屏幕之间导航的最佳实践_Java_Javafx_Fxml_Scene_Stage - Fatal编程技术网

JavaFX:在UI屏幕之间导航的最佳实践

JavaFX:在UI屏幕之间导航的最佳实践,java,javafx,fxml,scene,stage,Java,Javafx,Fxml,Scene,Stage,我想将UI屏幕从login.fxml更改为home.fxml 我应该更改舞台还是场景?我不确定哪种做法是最好的? 另外,我可以为控制器中的处理程序使用lambda表达式吗?首先,让我们从阶段开始场景问题: 众所周知,JavaFX层次结构基于:Stage->场景->节点(等) 请看这里: 实际上,在我看来,一条经验法则是未来: 如果您计划转到程序流程中的其他位置(例如登录->配置文件),请更改阶段 如果您在同一环境中(第一次登录->多次错误尝试后登录)-更改场景 至于lambdas:Ahhm

我想将UI屏幕从
login.fxml
更改为
home.fxml

我应该更改
舞台
还是
场景
?我不确定哪种做法是最好的?
另外,我可以为控制器中的处理程序使用lambda表达式吗?

首先,让我们从
阶段开始<代码>场景
问题:

众所周知,
JavaFX
层次结构基于:
Stage
->
场景
->
节点
(等)

请看这里:

实际上,在我看来,一条经验法则是未来:

  • 如果您计划转到程序流程中的其他位置(例如登录->配置文件),请更改
    阶段

  • 如果您在同一环境中(第一次登录->多次错误尝试后登录)-更改
    场景

至于lambdas:Ahhmmm。。。如果您当前的
Java
/
JavaFX
版本具有此功能,则没有理由不使用。 有关中控制器处理程序的详细信息,请参阅
Java 8,见此。

我在
JavaFX
中使用此方法更改场景:

/**
 * Controller class for menuFrame.fxml
 */
public class MenuFrameControl implements Initializable {

    @FXML private Button sceneButton1;
    @FXML private Button sceneButton2;
    @FXML private Button sceneButton3;

   /**
     * Event handling method, loads new scene from .fxml file
     * according to clicked button and initialize all components.
     * @param event
     * @throws IOException
     */
    @FXML
    private void handleMenuButtonAction (ActionEvent event) throws IOException {
        Stage stage = null;
        Parent myNewScene = null;

        if (event.getSource() == sceneButton1){
            stage = (Stage) sceneButton1.getScene().getWindow();
            myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene1.fxml"));
        } else if (event.getSource() == sceneButton2){
            stage = (Stage) flightBtn.getScene().getWindow();
            myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene2.fxml"));
        } else if (event.getSource() == sceneButton3) {
            stage=(Stage) staffBtn.getScene().getWindow();
            myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene3.fxml"));
        }

        Scene scene = new Scene(myNewScene);
        stage.setScene(scene);
        stage.setTitle("My New Scene");
        stage.show();
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) { }
因此,基本上当您单击按钮时,它会将实际显示的
Stage
对象保存到
Stage
变量中。然后它将新的
场景
对象从.fxml文件加载到
myNewScene
变量中,然后将这个新加载的
场景
对象放入保存的
阶段
对象中


使用此代码,您可以创建基本的三个按钮菜单,其中每个按钮切换到不同的场景,只需使用单个
Stage
对象。

请发布一个。我要求提供一个示例来演示此问题,因为我想知道到目前为止您尝试了什么。这是一个问题,我希望你能通过一些入门教程或稍加修改来回答自己。谢谢!我现在可能会坚持使用老式的版本,因为我将在稍后更熟悉JavaFX的时候开始并实现lambdas