A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本人也是javafx的小白,因为公司要开发客户端使用javafx技术,开发中遇到的一些坑分享给大家了解一下,话不多上,直接上代码

**

首先是点击按钮弹出两个窗口的实现

**`

try {
                        //点击按钮正常跳转fxml页面的逻辑
                        FXMLLoader loader = new FXMLLoader();
                loader.setLocation(Main.class.getResource("view/answer/AnswerView.fxml"));
                AnchorPane fingerView = (AnchorPane) loader.load();
                AnswerController controller = loader.getController();
                controller.rootVbox=rootVbox;
                controller.setMain(main);
                
                //如果当前存在第二个窗口,先关闭
                Stage stage2 = StageManager.STAGE.get("second");
                if(stage2 !=null) {
                        stage2.close();
                }
                
                        FXMLLoader loader2 = new FXMLLoader();
                  
                        Stage stage = new Stage();
                    AsrUtils.getInstance().url=AsrUtils.getInstance().proMap.get("address").toString()+"/assessmentInHeart/toPsychologicalTest?id="+AsrUtils.getInstance().id+"&article_id=1&type=0&returnAddress=detailed";
                    loader2.setLocation(Main.class.getResource("view/answer/Guide.fxml"));
                    AnchorPane yindao = (AnchorPane) loader2.load();
                    
                    GuideController controller2 = loader2.getController();
                    //将第二个窗口放入管理类中
                    StageManager.STAGE.put("second", stage);
//                    rootVbox.getChildren().add(fingerView);
                    controller2.setMain(main);
                            stage.setScene(new Scene(yindao));
                            stage.show();
                
                } catch (Exception e) {
                        e.printStackTrace();
                }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
`

上文中StageManager.STAGE.put(“second”, stage);这个是我创建了一个stage管理类
public class StageManager {
        //Stage容器存储第二个窗口,用来点击第一个窗口中的按钮时方便操作第二个窗口
        public static Map<String, Stage> STAGE=new HashMap<String, Stage>();
        //controller管理类实际应用中其实没用到
        public static Map<String, Object> CONTROLLER=new HashMap<String, Object>();

}
1
2
3
4
5
6
7
现在已经实现点击按钮弹出两个窗口了,第二个窗口可以手动拖动到双屏的另外一个屏幕(双屏机器正常都可以设置两个屏幕显示不同东西,百度一下,很简单的)。

点击第一个窗口中的按钮,如果第一个窗口使用的fxml页面,在后台controller中可以直接获取到button,我这里第一个窗口是嵌入的html页面,所以先给html页面传过去回调的对象

public class ArchivesController extends BaseView implements Initializable {

       
        @FXML
        private WebView webView;
        private WebEngine webEngine;
        private OpenAppUtil openAppUtil = new OpenAppUtil();
       
        @Override
        public void initialize(URL location, ResourceBundle resources) {
                if(webView != null) {
                       
                }else {
                        webView= new WebView();
                }
                if(webEngine != null) {
                       
                }else {
                        webEngine = webView.getEngine();
                }
                webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
                        public void changed(ObservableValue ov, State oldState, State newState) {

                                if (newState == Worker.State.SUCCEEDED) { // 页面加载成功
                                         JSObject win = (JSObject) webEngine.executeScript("window");
                                                 //把页面回调的对象传到html页面
                                win.setMember("openAppUtil", openAppUtil);
                                }
                        }
                });
               
                //加载html页面AsrUtils.getInstance().proMap.get("address").toString()是我再配置文件中定义的html访问的前缀
                webEngine.load(AsrUtils.getInstance().proMap.get("address").toString()+"/test/index");
        }
        @Override
        public void setMain(Main main) {
                this.main = main;
                //设置页面的高度可以写死,可以忽略
                webView.setPrefHeight(main.rootLayout.getHeight() - 70);
               
        }
       
        //html 页面回调方法
   public class OpenAppUtil {
            public void toFxml() {
                   
                    //从stage容器中取出第二个窗口,这里就可以操作第二个窗口了
                    Stage stage2 = StageManager.STAGE.get("second");
                    stage2.close();
                    try {
                        //操作第二窗口去加载一个页面
                            FXMLLoader loader = new FXMLLoader();
                    loader.setLocation(Main.class.getResource("view/answer/AnswerView.fxml"));
                    AnchorPane fingerView = (AnchorPane) loader.load();

                    rootVbox.getChildren().add(fingerView);
                    
                    AnswerController controller = loader.getController();
                    
                    
                    controller.setMain(main);
                    
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    }   
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

html页面回调javafx的代码直接使用openAppUtil.自定义的方法即可。
到这里基本上就实现了,在第一个窗口中操作实时刷新第二个窗口中的页面,如果有任何问题欢迎咨询,我就是一个小白,如果文章中有误导之处,还请批评指正。
---------------------
【转载,仅作分享,侵删】
作者:Lele___
原文:https://blog.csdn.net/Lele___/article/details/88662998
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

正序浏览
奈斯,感谢分享!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马