javaFx 从登陆到界面跳转

来源:互联网 发布:envi处理landsat数据 编辑:程序博客网 时间:2024/06/06 03:09

闲话少说,直接上图

登陆







写这篇文章呢是因为这是我的第一个javaFX项目,记录一下心得体会。

参考文档:http://www.javafxchina.net/blog/    中文API

1.首先来聊一聊登陆,这里有篇文章相当好:http://blog.csdn.net/nthack5730/article/details/51901593

但我没用该案例,对于我的这个项目,使用上述文章中的方法反而显得啰嗦麻烦。

   1.1)登陆的原理

           点击登陆,打开一个新窗口,关闭当前窗口。

           我这里呢使用的是同一个stage,所以不用关闭登录窗口,主页面会直接覆盖登陆窗口。

代码:

主舞台MainApp.java

@Overridepublic void start(Stage primaryStage) throws Exception {/* * System.setProperty("http.proxyHost", "127.0.0.1"); * System.setProperty("http.proxyPort", "8888"); * System.setProperty("https.proxyHost", "127.0.0.1"); * System.setProperty("https.proxyPort", "8888"); */stage = primaryStage;stage.setTitle("xxxxxxxxx系统");stage.getIcons().add(new Image(MainApp.class.getResourceAsStream("/com/cbss/fxmlSource/logo_b.png")));gotologin();stage.show();}

登陆方法

/** * 登录 */public void gotologin() {try {LoginController login = (LoginController) replaceSceneContent(LoginViewRes);login.setApp(this);} catch (Exception ex) {ex.printStackTrace();}}
/** * 实例化登录窗口 *  * @param fxml * @return * @throws Exception */public Initializable replaceSceneContent(String fxml) throws Exception {FXMLLoader loader = new FXMLLoader();InputStream in = MainApp.class.getResourceAsStream(fxml);loader.setBuilderFactory(new JavaFXBuilderFactory());loader.setLocation(getClass().getResource(fxml));GridPane page;try {this.page = (GridPane) loader.load(in);} finally {in.close();}Scene scene = new Scene(this.page, 344, 366);stage.setScene(scene);stage.sizeToScene();initView(this.page);return (Initializable) loader.getController();
注:initView是自己写的初始化页面方法(获取验证码),此处不做演示.

主页:

/** * 主页 *  * @throws Exception */public void gotomain() {try {MainController main = (MainController) mainSceneContent(mainViewRes);main.setApp(this);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
        /** * 实例主页窗口 *  * @param fxml * @return * @throws Exception */public Initializable mainSceneContent(String fxml) throws Exception {FXMLLoader loader = new FXMLLoader();InputStream in = MainApp.class.getResourceAsStream(fxml);loader.setBuilderFactory(new JavaFXBuilderFactory());loader.setLocation(getClass().getResource(fxml));BorderPane page;try {page = (BorderPane) loader.load(in);} finally {in.close();}//全屏Screen screen = Screen.getPrimary();Rectangle2D bounds = screen.getVisualBounds();stage.setX(bounds.getMinX());stage.setY(bounds.getMinY());stage.setWidth(bounds.getWidth());stage.setHeight(bounds.getHeight());Scene scene = new Scene(page);this.scene = scene;stage.setScene(scene);// stage.sizeToScene();return (Initializable) loader.getController();}

用户登录:

                /** * 用户登录d *  * @param userName * @param password * @param verifyCode * @throws Exception */public void userLogin(String userName, String password, String verifyCode)throws Exception {if (CheckLogin.checkLogin(userName, password, verifyCode)) {Platform.runLater(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubgotomain();}});}}

注意此处:若登陆时有一些业务逻辑要处理,此处需要使用线程Platform.runLater,否则程序会进入假死状态


LoginController.java

@FXMLprivate Text actiontarget;@FXMLprivate TextField userNameField;@FXMLprivate PasswordField passwordField;@FXMLprivate TextField verifyCode;@FXMLprivate ImageView verifyImg;private MainApp application;        /** * 点击按钮登录 * @param event */@FXMLprotected void handleSubmitButtonAction(ActionEvent event) {final String userName = userNameField.getText();final String password = passwordField.getText();String verifycode = verifyCode.getText();if (null == userName || "".equals(userName)) {actiontarget.setText("用户名不能为空");return;}if (null == password || "".equals(password)) {actiontarget.setText("密码不能为空");return;}if (null == verifycode || "".equals(verifycode)) {actiontarget.setText("验证码不能为空");return;}actiontarget.setText("");Task<Void> task = new Task<Void>() {    @Override    public Void call() throws InterruptedException {    try {application.userLogin(userName.toString(), password.toString(), verifyCode.toString());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();actiontarget.setText(e.getMessage());try {application.initView(application.page);} catch (IOException ce) {// TODO Auto-generated catch blockactiontarget.setText(ce.getMessage());}}return null;    }};ProgressBar bar = new ProgressBar();bar.progressProperty().bind(task.progressProperty());new Thread(task).start();                //登录时开启一个动画效果(一个旋转的圈圈)ProgressFromForLogin progressFrom = new ProgressFromForLogin(task, application.stage,130,160,"正在登录,请稍后...");progressFrom.activateProgressBar();}

好了,现在登录成功了,现在我们来看看左侧导航栏,右侧显示内容的页面怎么做吧!


参考案例:http://www.cnblogs.com/itwang/p/3631538.html   源代码丢失


该效果有两种方法,第一种方法采用开启多个窗口的方法(同时new多个fxml),

开启多个窗口:http://blog.csdn.net/nthack5730/article/details/51901593  


此处不再复述,


我用的是第二种方法,采用javaFX 自带的 tabpane


值得注意的是:tabpane和pane不同,它和Button一样是一个控件


首先呢还是先去画出想要的tabpane效果(我用的是screen builder)


MainController.java


有些代码不方便传,看着理解吧


首先,初始化时除了主页的tab

/** * 初始化 */@Overridepublic void initialize(URL arg0, ResourceBundle arg1) {// TODO Auto-generated method stubtabPaneId.getTabs().remove(1, 3);}

remove方法,含头不含尾。


/** * 跳转到综合查询 * @param event */@FXMLprotected void allQuery(ActionEvent event){int size = tabPaneId.getTabs().size();if (size > 1) {tabPaneId.getTabs().add(1,tabCheckId);} else {tabPaneId.getTabs().add(tabCheckId);}tabPaneId.getSelectionModel().select(tabCheckId);}

/** * 跳转到批量处理页面 * @param event */@FXMLprotected void batchQuery(ActionEvent event){int size = tabPaneId.getTabs().size();if (size > 1) {tabPaneId.getTabs().add(2, tabBatchQueryId);} else {tabPaneId.getTabs().add(tabBatchQueryId);}tabPaneId.getSelectionModel().select(tabBatchQueryId);}

好了,javaFx登录跳转及主页面告一段落了,其他就不在此叙述了。如有疑问,可留言,本人不定时上博客。

另:感谢javaFX群成员的帮助。


原创粉丝点击