闲话少说,直接上图
登陆
写这篇文章呢是因为这是我的第一个javaFX项目,记录一下心得体会。
参考文档:http://www.javafxchina.net/blog/ 中文API
1.首先来聊一聊登陆,这里有篇文章相当好:http://blog.csdn.net/nthack5730/article/details/51901593
但我没用该案例,对于我的这个项目,使用上述文章中的方法反而显得啰嗦麻烦。
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 task = new Task() {
@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();}
好了,现在登录成功了,现在我们来看看左侧导航栏,右侧显示内容的页面怎么做吧!
参考案例: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
/**
* 初始化
*/
@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群成员的帮助。