我最近在做學校裡一個關於作業系統的實驗,主要實現進程調度的演算法,但要求是可視化,即動態地表現出進程的變化情況.這就牽涉到了介面的動態變化,比如JLabel上的文字要不斷變化,由於我對SWING不熟悉所以碰到了一個大問題,如下.
比如我有一個Button被監聽,一旦按下便動態地不斷改變JLable上的文字.
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
while(條件){
slow();//減慢程式速度,容易看出動態變化
label.setText("不同內容");//每次顯示的內容不一樣
}
}
}
}
但很不幸出現了問題,label上只顯示迴圈最後一次出現的文字,事先聲明我加入了slow()方法來減慢變化速度,所以不存在由於變化過快無法看清的理由.查了點SWING的原理,發現SWING的組件是"畫"上去的,並不是像AWT那樣"粘"上去的,便聽了很多網友的告戒使用了很多重繪的方法,但還是不行.
此時有一件事讓我很在意,即其實label上的字只變化了一次,那便是迴圈的最後一次.我做了另一個實驗:
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
slow();//減慢程式速度,容易看出動態變化
label.setText("內容1");
slow();
label.setText("內容2");
}
}
}
結果是label上只顯示了內容2,內容1並沒有顯示. 這個時候我猜測了這樣一種可能:每次事件的觸發,只能改變
SWING一次,由於時間不多,我也無法求證,但總得解決這個問題.所以我準備迂迴這個問題.
我的做法是不斷觸發事件,來類比一個事件中的迴圈.
具體方法如下: 初始化一個SWING定時器, Timer time=new Timer(10,listener); 規定其每10秒執行一次,並把
事件交給listener監聽,一旦Button被按下,變讓time.start(); 然後time類便會每過10秒便會觸發事件,事件處理
裡寫的就是label.setText("不同內容"); 從而達到了目的.
雖然我這樣並不高效,但畢竟解決了問題,以後再慢慢研究swing了.:)