利用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
原创粉丝点击