JavaFX 进度条显示文件上传状态
JavaFX progress bar show file upload status
我正在使用 JavaFX(使用场景生成器)并且我正在尝试构建一个带有 progressIndicator 的进度条,它将显示后台文件上传状态。
这是我的 javafx 控制器(一些初始化):
@FXML
private Pane uploadsStatuses;
@FXML
private ProgressBar uploadBar;
@FXML
private ProgressIndicator uploadProgressIndicator;
...
@Override
@FXML
public void initialize(URL url, ResourceBundle rb) {
...
assert uploadsStatuses != null : "fx:id=\"uploadsStatuses\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
assert uploadBar != null : "fx:id=\"uploadBar\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
assert uploadProgressIndicator != null : "fx:id=\"uploadProgressIndicator\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
...
为了上传文件,我正在使用 FTP4J 库,并且我已经实现了一种计算文件上传百分比的方法:
public class Ftp4jListener implements FTPDataTransferListener {
private int transfBytes=0;
private int totalBytes=0;
private long fileSize = -1;
private String fileName;
...
@Override
public void transferred(int length)
{
transfBytes+=length;
float percent = (float) transfBytes / this.fileSize;
float fPercent = percent*100;
log.info("File: " + this.fileName + " | Bytes transfered "+ transfBytes + " Percentage: " + fPercent + "%");
}
问题是我如何将 FTP4J 侦听器与我的 progressBar 和 progressIndicator 绑定?
或者:
重写您的侦听器 class 以使用 JavaFX 属性:
public class Ftp4jListener implements FTPDataTransferListener {
private final ReadOnlyIntegerWrapper transfBytes = new ReadOnlyIntegerWrapper();
private final ReadOnlyIntegerWrapper totalBytes = new ReadOnlyIntegerWrapper();
private final ReadOnlyLongWrapper fileSize = new ReadOnlyLongWrapper(-1);
public ReadOnlyIntegerProperty transfBytesProperty() {
return transfBytes.getReadOnlyProperty() ;
}
public int getTransfBytes() {
return transfBytesProperty().get();
}
// etc. for other two properties...
private String fileName;
...
@Override
public void transferred(int length)
{
transfBytes.set(tranfBytes.get()+length);
float percent = (float) transfBytes.get() / this.fileSize.get();
float fPercent = percent*100;
log.info("File: " + this.fileName + " | Bytes transfered "+ transfBytes.get() + " Percentage: " + fPercent + "%");
}
}
然后您可以使用一个或多个属性注册一个侦听器并更新您的进度条:
ftp4jListener.transfBytesProperty().addListener((obs, oldValue, newValue) ->
uploadBar.setProgress(((double)ftp4jListener.getTransfBytes())/ftp4jListener.getFileSize()));
如果您在后台线程中传输数据(您应该这样做),请务必更新 FX 应用程序线程上的进度条:
ftp4jListener.transfBytesProperty().addListener((obs, oldValue, newValue) ->
Platform.runLater(() ->
uploadBar.setProgress(((double)ftp4jListener.getTransfBytes())/ftp4jListener.getFileSize())));
或从Task
调用updateProgress(...)
,并将进度条的进度属性绑定到任务的进度属性。
或者:
编写您的侦听器以接受回调:
public class Ftp4jListener implements FTPDataTransferListener {
private int transfBytes=0;
private int totalBytes=0;
private long fileSize = -1;
private String fileName;
private final DoubleConsumer percentageCallback ;
public Ftp4jListener(DoubleConsumer percentageCallback) {
this.percentageCallback = percentageCallback ;
}
...
@Override
public void transferred(int length)
{
transfBytes+=length;
float percent = (float) transfBytes / this.fileSize;
float fPercent = percent*100;
percentageCallback.accept(fPercent);
log.info("File: " + this.fileName + " | Bytes transfered "+ transfBytes + " Percentage: " + fPercent + "%");
}
}
然后您可以将侦听器创建为
Ftp4jListener ftp4jListener = new Ftp4jListener(percent ->
Platform.runLater(() -> uploadBar.setProgress(percent)));
我正在使用 JavaFX(使用场景生成器)并且我正在尝试构建一个带有 progressIndicator 的进度条,它将显示后台文件上传状态。
这是我的 javafx 控制器(一些初始化):
@FXML
private Pane uploadsStatuses;
@FXML
private ProgressBar uploadBar;
@FXML
private ProgressIndicator uploadProgressIndicator;
...
@Override
@FXML
public void initialize(URL url, ResourceBundle rb) {
...
assert uploadsStatuses != null : "fx:id=\"uploadsStatuses\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
assert uploadBar != null : "fx:id=\"uploadBar\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
assert uploadProgressIndicator != null : "fx:id=\"uploadProgressIndicator\" was not injected: check your FXML file 'FXMLDocument.fxml'.";
...
为了上传文件,我正在使用 FTP4J 库,并且我已经实现了一种计算文件上传百分比的方法:
public class Ftp4jListener implements FTPDataTransferListener {
private int transfBytes=0;
private int totalBytes=0;
private long fileSize = -1;
private String fileName;
...
@Override
public void transferred(int length)
{
transfBytes+=length;
float percent = (float) transfBytes / this.fileSize;
float fPercent = percent*100;
log.info("File: " + this.fileName + " | Bytes transfered "+ transfBytes + " Percentage: " + fPercent + "%");
}
问题是我如何将 FTP4J 侦听器与我的 progressBar 和 progressIndicator 绑定?
或者:
重写您的侦听器 class 以使用 JavaFX 属性:
public class Ftp4jListener implements FTPDataTransferListener {
private final ReadOnlyIntegerWrapper transfBytes = new ReadOnlyIntegerWrapper();
private final ReadOnlyIntegerWrapper totalBytes = new ReadOnlyIntegerWrapper();
private final ReadOnlyLongWrapper fileSize = new ReadOnlyLongWrapper(-1);
public ReadOnlyIntegerProperty transfBytesProperty() {
return transfBytes.getReadOnlyProperty() ;
}
public int getTransfBytes() {
return transfBytesProperty().get();
}
// etc. for other two properties...
private String fileName;
...
@Override
public void transferred(int length)
{
transfBytes.set(tranfBytes.get()+length);
float percent = (float) transfBytes.get() / this.fileSize.get();
float fPercent = percent*100;
log.info("File: " + this.fileName + " | Bytes transfered "+ transfBytes.get() + " Percentage: " + fPercent + "%");
}
}
然后您可以使用一个或多个属性注册一个侦听器并更新您的进度条:
ftp4jListener.transfBytesProperty().addListener((obs, oldValue, newValue) ->
uploadBar.setProgress(((double)ftp4jListener.getTransfBytes())/ftp4jListener.getFileSize()));
如果您在后台线程中传输数据(您应该这样做),请务必更新 FX 应用程序线程上的进度条:
ftp4jListener.transfBytesProperty().addListener((obs, oldValue, newValue) ->
Platform.runLater(() ->
uploadBar.setProgress(((double)ftp4jListener.getTransfBytes())/ftp4jListener.getFileSize())));
或从Task
调用updateProgress(...)
,并将进度条的进度属性绑定到任务的进度属性。
或者:
编写您的侦听器以接受回调:
public class Ftp4jListener implements FTPDataTransferListener {
private int transfBytes=0;
private int totalBytes=0;
private long fileSize = -1;
private String fileName;
private final DoubleConsumer percentageCallback ;
public Ftp4jListener(DoubleConsumer percentageCallback) {
this.percentageCallback = percentageCallback ;
}
...
@Override
public void transferred(int length)
{
transfBytes+=length;
float percent = (float) transfBytes / this.fileSize;
float fPercent = percent*100;
percentageCallback.accept(fPercent);
log.info("File: " + this.fileName + " | Bytes transfered "+ transfBytes + " Percentage: " + fPercent + "%");
}
}
然后您可以将侦听器创建为
Ftp4jListener ftp4jListener = new Ftp4jListener(percent ->
Platform.runLater(() -> uploadBar.setProgress(percent)));