0

我正在尝试在将文件发送到服务器的程序中制作进度条或类似的东西。我有这个

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());  
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());  

oos.writeObject(file.getName());  

FileInputStream fis = new FileInputStream(file);  
byte [] buffer = new byte[Server.BUFFER_SIZE];  
Integer bytesRead = 0;  
jj = size-bytesRead;
int i = 0;

while ((bytesRead = fis.read(buffer)) > 0) {  
     oos.writeObject(bytesRead);  
     jButton3.doClick();
     oos.writeObject(Arrays.copyOf(buffer, buffer.length));  
}  
oos.close();  
ois.close();  

这是 Button3

temp = temp - 100;
jLabel3.setText(String.valueOf(temp));

temp是所选文件的大小,我要减去 100,因为它是循环中每一步的字节大小。

问题是当我开始发送文件时,Button3 是灰色的,直到发送结束时标签什么也不可见(就像按时更新标签太慢了),但最后它显示了正确的数据。

为什么它不能定期更新标签?我应该怎么做才能解决这个问题?感谢您的任何建议。

4

1 回答 1

2

您可能正在Event Dispatch Thread上执行 I/O ,这会阻止 UI 处理其正常的绘制事件。如果您有一个长时间运行的操作,您不应该在 EDT 上执行此操作(例如,通过在侦听器中执行此操作,例如ActionListener单击按钮)。

您需要在后台线程中完成这项工作并将更新发送到 UI。一个简单的方法是使用SwingWorker. 将长时间运行的代码放入doInBackground(). publish(byteCount)当您读取一些byteCount字节时调用。然后在process()更新进度条。

SwingWorker这是一个更新 a的示例JProgressBarjava update progressbar

于 2013-04-07T21:29:47.063 回答