gpt4 book ai didi

java:使用 JSch SFTP 在 TextArea/JProgressBar 中实时更新上传进度

转载 作者:行者123 更新时间:2023-11-30 11:50:24 25 4
gpt4 key购买 nike

我有两个类文件 upload.javatransferProgress.javaupload.java 制作小程序 GUI 并将文件上传到远程 SSH 服务器。 transferProgress.java 类给出传输百分比。上传完成的百分比可以在控制台中看到,但我希望它可以在 TextArea 和 java 进度条上看到。所以我让 transferProgress.java 继承 upload.java 并附加到 TextArea

我的问题是,TextAreaJProgressBar 在文件传输期间不会更新,但只有在文件传输完成后才会更新。传输完成后,TextArea 显示日志并且 JProgressBar 设置为 100%。我的代码在文件传输期间不更新 TextAreaJProgressBar

如果我使用 setText() 而不是 append 来更新 TextArea,我可以看到实时进度更新,但 ProgressBar 仍然不会实时更新。

我想不出问题出在哪里。我将非常感谢您的帮助。

上传.java

package biforce;
import java.applet.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;


import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;


public class upload extends Applet
{

String filename;
int port = 22;
String user = "root";
String password = "mypass";
String host = "192.168.0.5";
String knownHostsFile = "/home/bishwo/.ssh/known_hosts";
String sourcePath = "";
String destPath = "/media/dfs/gwas/";

JTextField txtField = new JTextField(20);
static TextArea txtArea;
static JProgressBar progressBar;

@Override
public void init(){

// text Field
txtField.setEditable(false);
txtField.setText("");

// text area
txtArea = new TextArea(4,40);
txtArea.setEditable(false);

// JprogressBar
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setStringPainted(true);

// Label
JLabel fileLabel = new JLabel("File");

// buttons
JButton upload = new JButton( "Upload" );
JButton browse = new JButton( "Browse" );

// browse file to be uploaded
browse.addActionListener(
new ActionListener()
{
@Override
public void actionPerformed( ActionEvent ae )
{
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory( new File( "/home/bishwo/Desktop/" ) );
int returnVal = fc.showOpenDialog( upload.this );
String filePath="";
if ( returnVal == JFileChooser.APPROVE_OPTION )
{
File aFile = fc.getSelectedFile();
filePath = aFile.getAbsolutePath();
filename = aFile.getName();
}
txtField.setText(filePath);
}
});
// upload the browsed file
upload.addActionListener(
new ActionListener()
{
@Override
public void actionPerformed( ActionEvent ae )
{

if(txtField.getText().length()==0)
{
JOptionPane.showMessageDialog(upload.this,"Please select a file to upload.","Error", JOptionPane.ERROR_MESSAGE);
}
else
{
try
{
sourcePath=txtField.getText();
JSch jsch = new JSch();
jsch.setKnownHosts(knownHostsFile);
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.connect();

ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();

txtArea.setText("Uploading..");
transferProgress progress = new transferProgress();
sftpChannel.put( sourcePath,destPath+filename, progress);
System.out.println("\nUpload Completed");

sftpChannel.exit();
session.disconnect();
JOptionPane.showMessageDialog(upload.this,"Upload completed successfully.","Info", JOptionPane.INFORMATION_MESSAGE);

}
catch(Exception e)
{
JOptionPane.showMessageDialog(upload.this,e,"Error", JOptionPane.ERROR_MESSAGE);
}
}
}
});

add(fileLabel);
add(txtField,"center");
add(browse);
add(upload);
add(progressBar);
add(txtArea);
}

}

transferProgress.java

import com.jcraft.jsch.*;

public class transferProgress extends upload implements SftpProgressMonitor
{
public double count=0;
private int percentage;
public double totalSize;
private int lastPercentage;
@Override
public void init(int op, String src, String dest, long max)
{
this.totalSize=max;
}

@Override
public boolean count(long count)
{
this.count += count;
this.percentage = (int) ((this.count / this.totalSize) * 100.0);
if (this.lastPercentage <= this.percentage - 5)
{
this.lastPercentage= this.percentage;
// setValue() does not work
biforce.upload.progressBar.setValue(20);
// append() does not work
biforce.upload.txtArea.append(Integer.toString(this.percentage));
// displays percentage completion on console
System.out.println("Upload Completion "+this.percentage+" %");

}
return true;
}

@Override
public void end()
{
System.out.println("Total Copied "+this.percentage+" %");
}
}

最佳答案

您需要在单独的线程中更新进度条。

我建议让您的类 transferProgress(注意:类名应以大写字母开头)实现 Runnable Interface然后使用 ExecutorService用这个类开始一个新线程。

例如

public class TransferProgress extends upload implements SftpProgressMonitor, Runnable {
@Override
public void run() {
//update your progressbar here, basically the same as your count method
}
}

public class upload extends Applet {
//some code...
upload.addActionListener(
new ActionListener()
{
@Override
public void actionPerformed( ActionEvent ae )
{
//some code....
//start a new thread here which executes your run method in the TransferProgress class
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new TransferProgress());
//some code...
}
}
);

}

关于java:使用 JSch SFTP 在 TextArea/JProgressBar 中实时更新上传进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8034311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com