Java Swing如何即時重新整理JTextArea,以顯示剛才加append的內容
在代碼中執行完textArea.append("message")後,如果你想讓這個更新立刻顯示在介面上而不是等swing的主線程返回後重新整理,我們一般會在該語句後調用textArea.invalidate()和textArea.repaint()。問題是這個方法並不能有任何效果,textArea的內容沒有任何變化,這或許是swing的一個bug,有一個笨拙的辦法可以實現這個效果,就是執行以下語句textArea.paintImmediately(textArea.getBounds());
或
textArea.paintImmediately(textArea.getX(), textArea.getY(), textArea.getWidth(), textArea.getHeight());
這時,你會發現你剛才增加的訊息已經被即時地顯示出來了。
1 樓 saga_java 2012-06-07
你確信textArea.append("message")是運行在swing事件處理線程上?
SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {textArea.append("message");}});
2 樓 周凡楊 2012-06-07
應該是在Frame視窗的線程上,因為我點擊按鈕後,去進行資料處理,資料處理需要很長時間,此時按鈕一直呈現的是被點擊的樣式,Frame線程被阻塞了,所以textArea.append("message");運行後,文字框裡沒有即時的呈現出來!而且現在還有另一種方法,就是在處理資料時,另起一個線程,此時不管處理資料需要多長時間,textArea.append("message");運行後,文字框裡會即時呈現出來!
3 樓 saga_java 2012-06-07
比較耗費時間的操作不應該在swing事件處理線程上,只有另起一個線程
執行個體
其他外類對jTextArea進行即時更新顯示時,首先要將jTextArea設定為public static,比如有主視窗Frame,其帶有一個jTextArea,要把Data所擷取的資料即時更新到Frame的jTextArea中。則:
假定主視窗Frame類為:
class Frame extends jFrame implements ……{ //設定jTextArea public static jTextArea jtextarea; …… public Frame (){//建構函式 jtextarea =new jtTextarea (); …… ShowData();//假設建立主表單時,就要擷取,並顯示資料 …… } public void ShowData(){ new Thread(new Runnable() {//啟動資料擷取,更新顯示進程 public void run() { Data d = new Data(); d. outData(); } }).start(); // } …… }
假定資料類Data為:
class Data{ …… public Data(){ …… } …… //假設資料為一個自增數,不斷輸出資料 public void outData(){ for(int i=0; i<10000;i++) Frame.jtextarea.append( "當前資料為:"+i+"\n"); //調用主視窗的jtextarea進行添加資料,顯示 try { Thread.currentThread().sleep(100);//讓當前的進程睡眠若干毫秒,更加顯示出動態更新效果,當然這將耗時 } catch (InterruptedException ex) { //捕獲中斷異常} } …… }