Java 重新设置文件大小计数器

Java 重新设置文件大小计数器,java,Java,我试图在我的程序中制作一个进度条或类似的东西,将文件发送到服务器。我有这个 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject(file.getName()); FileInputStream fis = ne

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

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();  
这是按钮3

temp = temp - 100;
jLabel3.setText(String.valueOf(temp));
temp
是所选文件的大小,我要减去100,因为它是循环中每个步骤的字节大小

问题是,当我开始发送文件时,Button3变灰,直到发送结束时,标签不可见(好像它太慢,无法及时更新标签),但最后显示的是正确的数据


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

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

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

下面是一个更新
JProgressBar
SwingWorker
示例: