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

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

1 场景描述

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

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

2 实现效果

利用JavaFx开发RIA桌面应用-加载等待界面设计_第1张图片

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 databaseList;
    private String exception;
    private int status;

    public int getStatus(){
        return status;
    }
    public String getExceptions(){
        return exception;
    }

    public List 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> 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 observable, Integer oldValue, Integer newValue) {

        if (task.getStatus() == 1) {

            // 获取xml操作对象,读取默认数值
            XMLFileServiceImpl xmlFileService = XMLFileObject.getInstance();

            List databaseList = task.getDatabaseList();

            if (databaseList != null && databaseList.size() > 0) {
                ObservableList 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() {
            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桌面应用-在线资料》

你可能感兴趣的:(JAVA,JavaFX)