我正在尝试在我的程序中创建一个进度条或类似的东西,将文件发送到服务器。我是这个
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是灰色的,直到发送结束时没有看到任何标签可见(比如按时更新标签太慢),但最后它显示正确的数据。
为什么它不能定期更新标签?我该怎么做才能解决这个问题?谢谢你的任何建议。
答案 0 :(得分:2)
您可能正在Event Dispatch Thread上执行I / O操作,这会阻止UI处理其正常的绘制事件。如果你有一个长时间运行的操作,你不应该在EDT上这样做(例如,通过在ActionListener
之类的监听器中进行按钮单击操作。
您需要在后台线程中执行此操作并将更新发送到UI。一种简单的方法是使用SwingWorker
。将长时间运行的代码放在doInBackground()
中。当您读取一些publish(byteCount)
字节时,请调用byteCount
。然后在process()
更新进度条。
以下是更新SwingWorker
的{{1}}示例:java update progressbar