簡體   English   中英

JavaFX進度欄顯示文件上傳狀態

[英]JavaFX progress bar show file upload status

我正在使用JavaFX(使用場景生成器),並且正在嘗試使用帶有progressIndicator的progressBar來構建progressBar,以顯示背景文件的上傳狀態。

這是我的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綁定?

要么:

重寫您的偵聽器類以使用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 Application Thread上的進度條:

ftp4jListener.transfBytesProperty().addListener((obs, oldValue, newValue) -> 
    Platform.runLater(() -> 
        uploadBar.setProgress(((double)ftp4jListener.getTransfBytes())/ftp4jListener.getFileSize())));

或從Task調用updateProgress(...) ,然后將進度條的progress屬性綁定到任務的progress屬性。

要么:

編寫您的偵聽器以接受回調:

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)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM