2013-04-07 45 views
0

我試圖做一個進度條之類的在我的計劃是將文件發送到服務器的東西。我有這個Remaiming文件大小計數器

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是灰色的,直到發送結束時沒有任何可見的標籤(比如它太慢以至於無法及時更新標籤),但最終顯示的是正確的數據。

爲什麼不能定期更新的標籤嗎?我應該怎麼做才能解決這個問題?感謝您的任何建議。

回答

2

你可能做的Event Dispatch Thread,這是防止處理其正常的油漆事件UI中的I/O。如果你有一個長時間運行的操作,你不應該在EDT上這樣做(例如通過在像ActionListener這樣的監聽器中進行按鈕點擊)。

你需要做的這項工作在後臺線程和更新發送到UI。一個簡單的方法是使用SwingWorker。將長期運行的代碼放入doInBackground()。當您閱讀byteCount字節時請致電publish(byteCount)。然後在process()更新進度條。

這裏有一個更新JProgressBarSwingWorker一個例子:java update progressbar