利用JavaFx开发RIA桌面应用-加载等待界面设计
来源:互联网 发布:淘宝上专卖店有假货吗 编辑:程序博客网 时间:2024/06/06 03:49
转载请注明来源-作者@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桌面应用-在线资料》
0 0
- 利用JavaFx开发RIA桌面应用-加载等待界面设计
- 利用JavaFx开发RIA桌面应用-加载等待界面禁用的两种不同方法
- 利用JavaFx开发RIA桌面应用-在线资料
- 利用JavaFx开发RIA桌面应用-布局说明
- 利用JavaFx开发RIA桌面应用-事件监听
- 利用JavaFx开发RIA桌面应用-文件拖拽
- 利用JavaFx开发RIA桌面应用-文件拖拽
- 利用JavaFx开发RIA桌面应用-Stage窗口半透明设计
- 利用JavaFx开发RIA桌面应用-构架思路
- 利用JavaFx开发RIA桌面应用-Clipboard剪贴板操作
- 利用JavaFx开发RIA桌面应用-TableView操作
- 利用JavaFx开发RIA桌面应用-TabPane控件使用
- 利用JavaFx开发RIA桌面应用-在线资料
- 利用JavaFx开发RIA桌面应用-ComboBox组合编辑框水平增长
- 利用JavaFx开发RIA桌面应用-改变stage的标题栏的图标
- 利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框
- 利用JavaFx开发RIA桌面应用-Windows任务栏图标闪烁效果
- 利用JavaFx开发RIA桌面应用-Stage窗口关闭监听,并弹出确认提示框
- Microsoft Azure eventhub相关文档
- Android Studio自定义控件,自定义属性
- IOS现在推送需要增加一个属性content-available
- hadoop集群不管怎么启动在hadoop管理界面都看到只有一个datanode
- IOS Layer 简析
- 利用JavaFx开发RIA桌面应用-加载等待界面设计
- 设计模式之——享元(Flyweight)模式
- DiffUtil使用总结
- iOS samba SBM协议
- 单例Singleton的“懒汉式”与“饿汉式”实现方法
- 阻止事件(取消其默认行为并阻止其传播)
- Ubuntu16.04下为chrome/firefox安装flash player插件(即chrome浏览器安装)
- iOS label自适应高度
- jquery.nestable 树型结构