利用JavaFx开发RIA桌面应用-加载等待界面设计

2017-01-13 15:00:36来源:csdn作者:loongshawn人点击

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/52996382

1 场景描述

JavaFX客户端界面上的按钮点击后会去查询数据库,固此操作很耗时,如果不做任务处理,将会出现假死现象,因此想给这个等待的过程加载一个等待动画界面。

这个等待界面达到的效果就是,点击按钮加载等待界面,任务执行结束,关闭等待界面,回到主界面。

2 实现效果

3 具体过程

整个过程拆分为4块:等待界面(new stage)、主页面点击监听、业务执行任务(task)、任务状态监听。

下面依据程序加载的顺序来依次说明每一步。

第一步:主页面点击监听,这一步需要监听主页面引起这个事物的控件,比如我的是按钮,下例子中是对ComboBox控件的鼠标右键点击事件监听。

// 主界面监听
databaseNameInput.setOnMouseClicked(new ComboBoxMouseEvent());// 实现监听类
public class ComboBoxMouseEvent implements EventHandler<MouseEvent> {public void handle(MouseEvent mouseEvent) {MouseButton button = mouseEvent.getButton();if (button == MouseButton.SECONDARY) {MyTask task = new MyTask();
task.valueProperty().addListener(new MyTaskListener());ProgressFrom progressFrom = new ProgressFrom(task);
progressFrom.activateProgressBar();}
}
}

第二步:业务执行任务(task)的创建,即本事例中的数据库查询任务,这里创建了一个MyTask类,call方法中即任务主体,任务执行完毕返回1。

public class MyTask extends Task<Integer> {private static final Logger logger = Logger.getLogger(MyTask.class);private String serverName;
private String userName;
private String passWord;private List<String> databaseList;
private String exception;
private int status;public int getStatus(){
return status;
}
public String getExceptions(){
return exception;
}public List<String> getDatabaseList(){
return databaseList;
}public MyTask(String serverName, String userName, String passWord){
this.serverName = serverName;
this.userName = userName;
this.passWord = passWord;
}protected Integer call() throws Exception {DBHelper dbHelper = DBHelperObject.getInstance();
DBOperation dbOperation = DBOperationObject.getInstance();dbHelper.setUrl(SQLUtil.getSQL(serverName,"master"));
dbHelper.setUsername(userName);
dbHelper.setPassword(passWord);Response response = dbHelper.getConnection();
if (response.getStatus() == 1){
logger.info("数据库连接成功");
Response response1 = dbOperation.query(response.getConnection(), Constant.DEFALUT_SQL);
if (response1.getStatus() == 1){
logger.info("数据查询完成");
List<HashMap<String,Object>> list = response1.getList();
databaseList = MapUtil.getDatabaseList(list,"name");
status = 1;
logger.info(databaseList);
} else {
exception = response1.getException();
}
} else {
exception = response.getException();
}if (exception != null && !exception.equals("")) {status = 0;
logger.debug(exception);
}return 1;
}

第三步:任务状态监听,即主界面中需要对上步中创建的任务执行状态做监听,以便任务执行完毕更新主界面。

// 第一步中的方法代表了主界面的任务状态监听
task.valueProperty().addListener(new MyTaskListener());// 具体监听代码
public class MyTaskListener implements ChangeListener<Integer> {public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) {if (task.getStatus() == 1) {// 获取xml操作对象,读取默认数值
XMLFileServiceImpl xmlFileService = XMLFileObject.getInstance();List<String> databaseList = task.getDatabaseList();if (databaseList != null && databaseList.size() > 0) {
ObservableList<String> database_items = FXCollections.observableList(databaseList);
databaseName.setItems(database_items);
}} else {String exception = task.getExceptions();if (exception != null && !exception.equals("")) {databaseName.setItems(null);
Text text = new Text();
text.setText(StringUtil.toConsoleString(exception));
text.setFill(Color.RED);
console.getChildren().add(text);
}
}
}
}

第四步:启动等待页面,即new stage同时执行业务线程,此界面是一个透明的等待页面,task执行结束后,页面会自动关闭。

这里需要注意一点:需要添加窗口父子关系属性,不然加载窗口会与父窗口并存,形成2个窗口,解决这个问题只需要在加载页面代码中添加dialogStage.ininOwner(primaryStage);这样加载窗口就会与父窗口融合为一个窗口。

public class ProgressFrom {private static final Logger logger = Logger.getLogger(ProgressFrom.class);private Stage dialogStage;
private ProgressIndicator progressIndicator;public ProgressFrom(final Task<?> task,Stage primaryStage) {dialogStage = new Stage();
progressIndicator = new ProgressIndicator();// 窗口父子关系
dialogStage.ininOwner(primaryStage);
dialogStage.initStyle(StageStyle.UNDECORATED);
dialogStage.initStyle(StageStyle.TRANSPARENT);
dialogStage.initModality(Modality.APPLICATION_MODAL);// progress bar
Label label = new Label("数据加载中, 请稍后...");
label.setTextFill(Color.BLUE);
//label.getStyleClass().add("progress-bar-root");
progressIndicator.setProgress(-1F);
//progressIndicator.getStyleClass().add("progress-bar-root");
progressIndicator.progressProperty().bind(task.progressProperty());VBox vBox = new VBox();
vBox.setSpacing(10);
vBox.setBackground(Background.EMPTY);
vBox.getChildren().addAll(progressIndicator,label);Scene scene = new Scene(vBox);
scene.setFill(null);
dialogStage.setScene(scene);Thread inner = new Thread(task);
inner.start();task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
public void handle(WorkerStateEvent event) {
dialogStage.close();
}
});logger.info("UI");
}public void activateProgressBar() {
dialogStage.show();
}public Stage getDialogStage(){
return dialogStage;
}public void cancelProgressBar() {
dialogStage.close();
}
}

相关文章:


《 利用JavaFx开发RIA桌面应用-TableView操作》
《 利用JavaFx开发RIA桌面应用-Clipboard剪贴板操作》
《利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框》
《利用JavaFx开发RIA桌面应用-半透明界面设计》
《利用JavaFx开发RIA桌面应用-加载等待界面设计》
《利用JavaFx开发RIA桌面应用-文件拖拽》
《利用JavaFx开发RIA桌面应用-改变stage的标题栏的图标》
《利用JavaFx开发RIA桌面应用-事件监听》
《利用JavaFx开发RIA桌面应用-ComboBox组合编辑框水平增长》
《利用JavaFx开发RIA桌面应用-布局说明》
《利用JavaFx开发RIA桌面应用-在线资料》

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台