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

时间:2016-11-22 19:56:45

标签: java javafx fxml scene stage

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

我应该更改Stage还是Scene?我不确定哪种是最佳做法? 另外,我可以在控制器中为处理程序使用lambda表达式吗?

2 个答案:

答案 0 :(得分:13)

首先,让我们从Stage .vs开始。 Scene问题:

众所周知,JavaFX层次结构基于:Stage - > Scene - > Nodes(等)。

见这里:

enter image description here

实际上,我认为一个经验法则是未来

  • 如果您计划在程序流程中转到其他地点(例如,登录 - >个人资料),请更改Stage

  • 如果你在同一个环境(第一次登录 - >多次错误尝试后登录) - 更改Scene

至于lambdas :啊......如果你当前的Java / JavaFX版本具有这种能力 - 没有理由不使用。 有关控制器处理程序的更多信息  Java 8,请参阅此great tutorial

答案 1 :(得分:3)

我使用此方法更改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文件中的新Scene对象加载到myNewScene变量中,然后将这个新加载的Scene对象放入已保存的Stage对象中。

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