JavaFX的进度条窗口
- javaFX进度条的样式
- 该窗口所对应的Controller程序
- 该进度条窗口的使用方法
- 注意事项
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代码想要反馈运行进度时一定要搭配多线程技术来使用,否则将会使程序处于卡死状态。该窗口也将不会弹出。