闲话少说,直接上图

登陆

fx java 跳转传参 javafx跳转到另一个窗口_界面

fx java 跳转传参 javafx跳转到另一个窗口_java_02

fx java 跳转传参 javafx跳转到另一个窗口_界面_03

fx java 跳转传参 javafx跳转到另一个窗口_fx java 跳转传参_04


fx java 跳转传参 javafx跳转到另一个窗口_java_05

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

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

1.首先来聊一聊登陆,这里有篇文章相当好:

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

   1.1)登陆的原理

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

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

代码:

主舞台MainApp.java

@Override
	public 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 block
			e.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() {
				@Override
				public void run() {
					// TODO Auto-generated method stub
					gotomain();
				}
			});
		}
	}

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



LoginController.java

@FXML
private Text actiontarget;
@FXML
private TextField userNameField;
@FXML
private PasswordField passwordField;
@FXML
private TextField verifyCode;
@FXML
private ImageView verifyImg;
private MainApp application;

        /**
	 * 点击按钮登录
	 * @param event
	 */
	@FXML
	protected 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 block
					e.printStackTrace();
					actiontarget.setText(e.getMessage());
					try {
						application.initView(application.page);
					} catch (IOException ce) {
						// TODO Auto-generated catch block
						actiontarget.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();}



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



参考案例:   源代码丢失



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

开启多个窗口:  



此处不再复述,



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



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



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



MainController.java



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



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

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



remove方法,含头不含尾。



/**
	 * 跳转到综合查询
	 * @param event
	 */
	@FXML
	protected 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
	 */
	@FXML
	protected 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群成员的帮助。