在Java applet中显示FTP文件上载期间的进度
好的,所以我让上传者使用Java FTP上传文件,我想更新标签和进度条。 带有百分比文本的标签,带有百分比int值的栏。 现在使用当前代码只能在上传结束时获得100和完整栏。 在上传过程中,没有一个改变。
这里是:
OutputStream output = new BufferedOutputStream(ftpOut); CopyStreamListener listener = new CopyStreamListener() { public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) { System.out.printf("\r%-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); }
从它的声音(并且没有任何证据到the contree)听起来像你在事件调度线程中处理一个耗时的动作
您可能希望阅读Swing中的Concurrency以获得更深入的了解
我建议使用SwingWorker来执行实际传输并利用其内置的进度支持
看到源代码后更新
- 不要将重量较重的部件与轻质部件混合使用。 将
Applet
更改为JApplet
,将TextField
更改为JTextField
,不要使用Canvas
使用JPanel
或JComponent
- 如果您希望其他人阅读您的代码,请为您的变量使用正确的名称,我不知道
p
是什么。 - 你的
Thread
没用。 而不是启动线程并使用它的run
方法,您只需在其构造函数中进行下载调用。 这对你没什么用……
删除MyThread
的实现并替换为
public class MyWorker extends SwingWorker
在你的ActionListener
中使用o
(??)替换线程执行代码
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(); }
注意。 您忽略了传递给构造函数的URL。 http://不是ftp://所以我怀疑这会起作用……
在上传过程中,您看不到GUI的更改,因为您在同一个线程中运行上载和GUI更改。 你应该启动一个执行上传的threayd和另一个执行GUI更新的EDT(Event-Dispatch-Thread)。
有关详情,请参阅:
- 事件派遣线程
您应该在SwingWorker中实现传输逻辑,这样UI就有机会呈现进度。