JavaFX的进度条窗口

javaFX进度条的样式

这就是图片的样式
该窗口在工作过程中会从0%到100%之间来变化,并且在程序运行期间的三个点会从一个到三个之间循环显示,以表示等待状态。fxml文件的代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<?import com.jfoenix.controls.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane prefHeight="100.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="view.Prompt">
   <children>
      <Label layoutX="61.0" layoutY="28.0" text="已完成:" AnchorPane.leftAnchor="61.0" AnchorPane.topAnchor="20.0" />
      <Label fx:id="completion" layoutX="108.0" layoutY="28.0" text="0%" AnchorPane.leftAnchor="108.0" AnchorPane.topAnchor="20.0" />
      <JFXButton fx:id="ensure" layoutX="78.0" layoutY="56.0" onAction="#ensure" text="确 定" textFill="#0659dd" />
      <Label fx:id="point" layoutX="83.0" layoutY="35.0" text="。。。" AnchorPane.leftAnchor="85.0" AnchorPane.topAnchor="35.0" />
   </children>
</AnchorPane>

该窗口所对应的Controller程序

该窗口所对应Controller的Java代码如下所示:

package view;

import com.jfoenix.controls.JFXButton;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import prompt.IPrompt;

/**
 * @author LiDaodao
 * @version 1.0
 * @date 2020/5/14 15:26
 */
public class Prompt {
    private String a = "";
    private Stage primaryStage;
    private boolean is = true;
    private Service runPoint;
    private Service runCompletion;
    @FXML
    private Label completion,point;
    @FXML
    private JFXButton ensure;
    @FXML
    private void ensure(){
        primaryStage.close();
    }

    public void setStage(Stage stage) {
        this.primaryStage = stage;
    }


    public void setPrompt(IPrompt iPrompt) {
        ensure.setDisable(true);
        this.runPoint = new Service() {
            @Override
            protected Task createTask() {
                return new Task() {
                    @Override
                    protected Object call() throws Exception {
                        int flog=0;
                        while (is){
                            flog++;
                            String stringFlog = "";
                            if(flog<=3){
                                for (int i=0;i<flog;i++){
                                    stringFlog = stringFlog + "。";
                                }
                            }else {
                                flog = -1;
                            }
                            if(iPrompt.getPrompt()==100){
                                stringFlog = "。。。";
                            }
                            updateValue(stringFlog);
                            Thread.sleep(200);
                        }
                        return "success";
                    }
                };
            }
        };
        runCompletion = new Service() {
            @Override
            protected Task createTask() {
                return new Task() {
                    @Override
                    protected Object call() throws Exception {
                        while (is){
                            updateValue(iPrompt.getPrompt()+"%");
                            if(iPrompt.getPrompt()==100){
                                ensure.setDisable(false);
                            }
                            Thread.sleep(100);
                        }
                        return "success";
                    }
                };
            }
        };
        completion.textProperty().bind(runCompletion.valueProperty());
        point.textProperty().bind(runPoint.valueProperty());
        runPoint.start();
        runCompletion.start();
    }
}

该类中主要涉及到的方法有两个:
(1)public void setStage(Stage stage);方法
该方法的主要功能是传入上级的Stage(窗口)。
(2)public void setPrompt(IPrompt iPrompt);方法
该方法是该窗口的主要控制逻辑界面,通过多线程的方法实现程序运行进程的刷新。该方法主要传入的类为IPrompt类,该类并不是一个确定的类,而是一个实现了IPrompt接口的任何类,下面将展实IPrompt代码:

package prompt;

/**
 * @author LiRui
 * @version 1.0
 * @date 2020/6/23 17:19
 */
public interface IPrompt {
    int getPrompt();
}

通过上述代码可以看出,该接口主要包含了一个getPrompt方法,该方法的功能就是返回0到100的数字。当有数字返回时,进度条窗口Controller程序中的setPrompt方法将可以调用实现了IPrompt接口的类中的getPrompt方法来获取当前程序的执行进度。

该进度条窗口的使用方法

第一步:在想要获取执行进度的程序的Java类中定义int类型的prompt全局参数。
第二步:在想要获取执行进度的程序的Java类上实现IPrompt接口,并实现getPrompt方法。
第三步:在想要弹出进度条窗口的页面中传入实现了IPrompt的功能Java类,并同时执行该进度条窗口Stage的showAndWite();方法
第四步:在想要获取执行进度的程序的具体逻辑中不断更新所定义的prompt参数,其更新范围为0~100。
上述四个步骤中的第一、二、四步的代码举例如下所示:

public class Example implements IPrompt,Runnable {

    private int prompt;
	
	@Override
    public void run() {
        logic();
        prompt = 100;
    }
	
    private void logic(){
		//执行逻辑
		this.prompt = x;//其中x为具体的执行进度,其值为0~100;
	}
	@Override
    public int getPrompt() {
        return prompt;
    }
}

上述四个步骤中第三步的代码举例如下所示:

private void showPrompt(IPrompt iPrompt){
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(Action.class.getResource("/view/prompt.fxml"));
            AnchorPane homeLayout = loader.load();

            Stage stage = new Stage();
            stage.setTitle("请稍后");
            stage.initModality(Modality.WINDOW_MODAL);
            stage.initOwner(primaryStage);
            Scene scene = new Scene(homeLayout);
            stage.setScene(scene);
            Prompt prompt = loader.getController();
            prompt.setStage(stage);
            prompt.setPrompt(iPrompt);
            stage.showAndWait();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

该方法所传入的参数可以为任何实现了IPrompt接口的具体java功能类,例如步骤一、二、四所示代码中的Example类。

注意事项

具体的功能类java代码想要反馈运行进度时一定要搭配多线程技术来使用,否则将会使程序处于卡死状态。该窗口也将不会弹出。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值