热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaFX:实现页面切换

页面切换JavaFX多个页面(Stage)之间的切换的实现的基本思路:构建一个主Stage和多个副Stage页面(构建方式基

页面切换



JavaFX多个页面(Stage)之间的切换的实现的基本思路:
构建一个主Stage和多个副Stage页面(构建方式基本上市一样的);
在主Stage中设置某些控件的动作,这些动作通过触发副Stage页面的stage.show和stage.hide来实现副Stage的打开和关闭(或者将关闭动作绑定在副Stage的控件上);
主Stage和副Stage之间的数据交换,可以通过在主Stage或副Stage上储存相应的数据类,通过其进行数据交换(交换动作一般发生在副Stage打开或关闭的时间);

这种思路也可以用于实现自定义的弹窗;

带有数据交换的弹出窗口:
以下是一个示例:
   
 
  主页面
    
    
  1. 【Primary - Controller】
  2. public class Controller {
  3. @FXML Button newPage; //弹窗页面触发按钮
  4. public void initialize(){
  5. //弹出新页面
  6. newPage.setOnAction((ActionEvent e)->{
  7. Popup.Data data = Popup.showDialog(); //弹出窗口,并获取交换数据
  8. //控制台打印交换数据
  9. System.out.println(data.getId()+"\n"+data.getName()+"\n"+data.getCity());
  10. });
  11. }
  12. }

Popup页面
     
     
  1. Popup - Main
  2. public class Popup extends AnchorPane {
  3. private static Popup popup; //本类实例内部封装在静态数据域,
  4. private Data data ; //对外交换输出使用的自定义数据结构
  5. private Controller controller;
  6. priavte Stage primaryStage;
  7. //本类实例内部封装在静态数据域,构造方法私有
  8. private Popup(){
  9. try{
  10. FXMLLoader fxmlloader = new FXMLloader(getClass().getResource("myDialog.fxml"))
  11. Parent root = FXMLLoader.load();
  12. primaryStage = new Stage();
  13. primaryStage.setResizable(false); //固定窗口大小
  14. primaryStage.setTitle("Input your message");
  15. primaryStage.setScene(new Scene(root,300,275));
  16. Controller controller = fxmlloader.getControler();
  17. controller.start(popup); //传递Popup实例对象,同时启动Controller的按钮动作绑定
  18. }catch(IOException ex){
  19. ex.printStackTrace();
  20. }
  21. }
  22. //外部调用方法:显示弹窗,返回数据交换用的数据结构
  23. public static Data showPopup(){
  24. popup = new Popup();
  25. if(primaryStage != null)
  26. primaryStage.showAndWait();
  27. //显示弹窗,并中将原线程挂起;如果没有获取数据的需求,可以直接 primaryStage.show();
  28. return popup.getData();
  29. }
  30. //实例方法:关闭弹窗
  31. public void hide(){
  32. if(primaryStage != null)
  33. primaryStage.hide();
  34. }
  35. //实例方法:获取交换数据
  36. public Data getData(){
  37. return data;
  38. }
  39. //对外交换输出使用的自定义数据结构
  40. public static class Data{
  41. private String id;
  42. private String name;
  43. private String city;
  44. public Data(){
  45. }
  46. public Data(String id,String name,String city){
  47. this.id = id;
  48. this.name = name;
  49. this.city = city;
  50. }
  51. //省略数据域的get、set方法
  52. }


       
       
  1. Popup - Controller
  2. public class Controller {
  3. @FXML Button ok;
  4. @FXML Button cancel;
  5. @FXML TextField tfId;
  6. @FXML TextField tfName;
  7. @FXML TextField tfCity;
  8. public void initialize(){
  9. }
  10. public void startPopup popup){ //获取Main传递归来的Popup实例
  11. //提交按钮
  12. ok.setOnAction((ActionEvent e)->{
  13. popup.getData() = new Popup.Date(tfId.getText(),tfName.getText(),tfCity.getText());  
  14. //储存交换数据
  15. popup.hide();
  16. });
  17. //取消按钮
  18. cancel.setOnAction((ActionEvent e)->{
  19. popup.hide();
  20. });
  21. }



不带数据交换的弹出窗口
 主页面
    
    
  1. Primary - Controller
  2. public class Controller {
  3. @FXML Button newPage; //弹窗页面触发按钮
  4. public void initialize(){
  5. //弹出新页面
  6. newPage.setOnAction((ActionEvent e)->{
  7. Popup.showPopup(); //弹出窗口
  8. Popup.showPopup("hello world"); //传递参数,并弹出窗口
  9. });
  10. }
  11. }

Popup页面
     
     
  1. Popup - Main
  2. public class Popup extends AnchorPane {
  3. private static Popup popup;
  4. private String param;
  5. priavte Stage stage;
  6. //构造方法:私有
  7. private Popup(param){
  8. this.param = param;
  9. try{
  10. Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
  11. Stage stage = new Stage();
  12. stage.setTitle(engine.getTitle());
  13. stage.setScene(new Scene(root,800,600));
  14. }catch(IOException ex){
  15. ......
  16. }
  17. }
  18. priavte Popup(){
  19. this("no param");
  20. }
  21. public Stage getStage(){
  22. return this.stage;
  23. }
  24. //外部调用方法
  25. public static void showPopup(String param){
  26. popup = new Popup(param); //构造实例
  27. popup.getStage().show(); //显示页面
  28. }
  29. public static void showPopup(){
  30. popup = new Popup(param); //构造实例
  31. popup.getStage().show(); //显示页面
  32. }
  33. }


最简便方法

     
     
  1. 调用:
  2. button.setOnAction(event->{
  3. new Popup();
  4. });

     
     
  1. 【Popup-Main】
  2. public class Popup{
  3. public Popup(){
  4. Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
  5. Stage stage = new Stage();
  6. stage.setTitle(engine.getTitle());
  7. stage.setScene(new Scene(root,800,600));
  8. stage.show();
  9. }
  10. }





推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
Lululingling2002_886
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有