問題描述
好的,我讓上傳者使用 Java FTP 上傳文件,我想更新標簽和進度條.帶有百分比文本的標簽,帶有百分比 int 值的條形圖.現(xiàn)在使用當前代碼只能在上傳結束時獲得 100 條和完整條.在上傳期間,它們都沒有改變.
OK so I have the uploader uploading files using the Java FTP, I would like to update the label and the progress bar. Label with the percent text, bar with the percent int value. Right now with the current code only get the 100 and full bar at the end of the upload. During the upload none of them change.
這里是:
OutputStream output = new BufferedOutputStream(ftpOut);
CopyStreamListener listener = new CopyStreamListener() {
public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
System.out.printf("
%-30S: %d / %d", "Sent", totalBytesTransferred, streamSize);
ftpup.this.upd(totalBytesTransferred,streamSize);
}
public void bytesTransferred(CopyStreamEvent arg0) { }
};
Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);
}
public void upd(long num, long size){
int k = (int) ((num*100)/size);
System.out.println(String.valueOf(k));
this.d.setText(String.valueOf(k));
//d.setText(String.valueOf(k));
progressBar.setValue(k);
}
推薦答案
從它的聲音(并且缺乏任何證據(jù)證明)聽起來你在 事件調度線程
From the sounds of it (and lacking any evidence to the contree) it sounds like your processing a time consuming action in the Event Dispatching Thread
您可能想閱讀 Concurrency in Swing 了解一些進一步了解
You might like to read Concurrency in Swing for some further insight
我建議使用 SwingWorker 來執(zhí)行實際轉移利用其內置的進度支持
I'd suggest using a SwingWorker to perform the actual transfer & take advantage of its built in progress support
看到源代碼后更新
- 請勿將重量較重的組件與重量較輕的組件混用.將
Applet
改為JApplet
,將TextField
改為JTextField
,不要使用Canvas
使用JPanel
或JComponent
- 如果您希望其他人閱讀您的代碼,請為您的變量使用正確的名稱,我不知道
p
是什么. - 你的
Thread
沒用.而不是啟動線程并使用它的run
方法,您只需在它的構造函數(shù)中進行下載調用.這對您沒有任何幫助...
- Don't mix heavy weight components with light weight components. Change
Applet
toJApplet
, changeTextField
toJTextField
, don't useCanvas
use aJPanel
orJComponent
- If you expect other people to read your code, please use proper names for your variables, I have no idea what
p
is. - Your
Thread
is useless. Rather then starting the thread and using it'srun
method you simply make your download call within it's constructor. This will do nothing for you...
刪除 MyThread
的實現(xiàn)并將其替換為
Remove your implementation of MyThread
and replace it with
public class MyWorker extends SwingWorker<Object, Object> {
private URL host;
private File outputFile;
public MyWorker(URL host, File f) {
this.host = host;
outputFile = f;
}
@Override
protected Object doInBackground() throws Exception {
// You're ignoring the host you past in to the constructor
String hostName = "localhost";
String username = "un";
String password = "pass";
String location = f.toString();
//FTPClient ftp = null;
ftp.connect(hostName, 2121);
ftp.login(username, password);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.setKeepAlive(true);
ftp.setControlKeepAliveTimeout(3000);
ftp.setDataTimeout(3000); // 100 minutes
ftp.setConnectTimeout(3000); // 100 minutes
ftp.changeWorkingDirectory("/SSL");
int reply = ftp.getReplyCode();
System.out.println("Received Reply from FTP Connection:" + reply);
if (FTPReply.isPositiveCompletion(reply)) {
System.out.println("Connected Success");
}
System.out.println(f.getName().toString());
File f1 = new File(location);
in = new FileInputStream(f1);
FileInputStream input = new FileInputStream(f1);
// ftp.storeFile(f.getName().toString(),in);
//ProgressMonitorInputStream is= new ProgressMonitorInputStream(getParent(), "st", in);
OutputStream ftpOut = ftp.storeFileStream(f.getName().toString());
System.out.println(ftpOut.toString());
//newname hereSystem.out.println(ftp.remoteRetrieve(f.toString()));
OutputStream output = new BufferedOutputStream(ftpOut);
CopyStreamListener listener = new CopyStreamListener() {
public void bytesTransferred(final long totalBytesTransferred, final int bytesTransferred, final long streamSize) {
setProgress((int) Math.round(((double) totalBytesTransferred / (double) streamSize) * 100d));
}
@Override
public void bytesTransferred(CopyStreamEvent arg0) {
// TODO Auto-generated method stub
}
};
Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);
return null;
}
}
在 o
(??) 的 ActionListener
中,將線程執(zhí)行代碼替換為
In your ActionListener
of o
(??) replace the thread execution code with
try {
MyWorker worker = new MyWorker(new URL("http://localhost"), file);
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("progress")) {
Integer progress = (Integer) evt.getNewValue();
progressBar.setValue(progress);
}
}
});
worker.execute();
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
注意.您忽略了傳遞給構造函數(shù)的 URL.http://不是 ftp://所以我懷疑這會起作用......
Note. You are ignoring the URL you pass to the constructor. http:// is not ftp:// so I doubt this will work...
這篇關于在 Java 小程序中顯示 FTP 文件上傳期間的進度的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!