2011-09-04 59 views
0

目前,我有一個JFrame,其中包含一個JPanelJPanel是我的程序的油漆。 Paint意思是我所有的Graphics g。drawString的東西。 現在,只有當用戶與JFrame交互時,它纔會更新顯示,但我希望它在不使用while循環(CPU使用率過高)的情況下持續更新(repaint())本身。我該如何去爲我的JFrame自動更新繪畫?

任何人都知道我該怎麼做?

+0

你可以使用一個觀察者模式,所以當事情已經改變的時候纔會重新繪製。 – Marcus

回答

0

你需要做的是在你知道面板上圖像部分改變時通知擺動組件。正常的做法是,如您所說,請致電repaint(),如果您知道「無效」矩形,您也可以指出。

根據引起JPanel內容的事件,您需要更改應用程序設計,以便應用程序的表示部分「偵聽」下面的數據更改並在發生這些更改時重新繪製。

還有另一種方法,稱爲paintImmediately(),它可能適用於某些情況,但您必須多描述一下您的場景,以及在哪些情況下需要持續重繪。

+0

謝謝,但基本上:我已經實現了一個功能齊全的互聯網接力聊天系統,其中涉及油漆,看看你和其他人在說什麼。所以我只需要它不斷更新以顯示人們在說什麼。 – Confiqure

+0

是的,所以你需要做的是當你從網絡上得到一條新消息時,你知道你需要重繪()。標準方法是讓處理聊天消息的部分通知某個對象,該對象也具有對JPanel的引用,該JPanel在有新消息時調用repaint()。這被稱爲觀察者模式(如上面的Marcus所表示的),這僅僅意味着對象註冊對另一個對象的事件的興趣,每次發生事件時(例如新消息),該對象被通知。 – jbx

+0

但是,如果讓它自動重新繪製,會不會很簡單?沒有辦法做到這一點嗎? – Confiqure

0

我已經實現了其中涉及塗料看到你和其他人說什麼一個全功能的互聯網中繼聊天系統

這聽起來像你正試圖從服務器到「拉」的更新,然後您可以使用SwingWorker來查詢服務器的更新,然後將更新推送到GUI。您會希望SwingWorker進入睡眠狀態,因此它不會持續輪詢服務器。

有關更多信息,請參閱Worker Threads and SwingWorker上的Swing教程部分。

也許更好的設計是服務器應該「推」更新到客戶端,客戶端應該聽取更改,然後重新繪製自己。也許All About Sockets部分將幫助你。

編輯:

下面是一些舊的代碼我還沒有看在5年以上。 「客戶端」是一個簡單的文本窗格,它將每個鍵入的字符發送到「服務器」。服務器然後將每個字符發送到連接到服務器的任何其他客戶端。它認爲服務器擁有最新的Document。當一個客戶端發送更改時,所有其他客戶端都會收到通知。這樣所有的客戶端總是包含相同的數據。你的代碼應該更簡單,因爲你只會發送完整的消息到服務器。要運行該代碼打開一個DOS窗口,輸入:

的Java DocumentServer 1234

這將啓動監聽1234端口

然後打開另一個窗口,鍵入服務器

java DocumentClient 1234 3

這將創建3個連接到服務器的客戶端框架。在任何一個框架中打字都會更新服務器。

你可以在這裏的zip文件:

http://www.discoverteenergy.com/files/echo.zip

+0

請給出一個代碼示例? – Confiqure

+0

謝謝,我想。但是,我會如何將更新推送到客戶端呢? – Confiqure

+0

該示例是教程。有關更復雜的示例,請參閱我的編輯。 – camickr