2011-04-06 55 views
1

我建立一個棋盤遊戲的小程序,大約處理用戶輸入的被忽略的是這樣的:在Java中,AWT,重畫法似乎有利於啓動方法

public void mousePressed(MouseEvent event) { 
    int row = event.getX()/(getSize().width/8) ; 
    int column = event.getY()/(getSize().height/8) ; 
    if(possibleMove(column, row) { 
     makeMove(column,row,whosTurn); 
     repaint(); 
     start(); 
    } 
} 

後人類輸入,計算機選擇一個移動並像這個方法一樣調用repaint()和start()。
但是,屏幕似乎只有在計算機已經移動後纔會更新,因此在調用start()之後。這是怎麼發生的,因爲repaint()在start()之前被調用?

我懷疑這可能是因爲repaint()啓動一個新的線程(是嗎?),但爲什麼它會等待start()?

當然,如果需要,我可以提供更多的代碼。

回答

5

repaint()調用不執行重繪 - 它計劃重繪完成。在任何當前和已安排的事件完成之後(事件發生的時間可能比其他原因無關),事件線程稍後會進行實際的重新繪製。在調度完成後立即調用start()方法,作爲響應當前事件的一部分。所以是的,實際的繪圖將始終在start()被調用後發生。

有關更多詳細信息,請參閱the description of repaint()the description of the paint mechanism

一般來說,像這樣調用start()可能是不好的。當調用start()時,UI無法響應任何事情(例如遊戲窗口正在調整大小或未被覆蓋),除非start()是非常短的動作,否則將導致UI看起來沒有響應。

1

@DJClayworth已經解釋了爲什麼你的應用程序的行爲作爲它,但如果你有JComponent工作,你絕對需要重繪自己的事件處理過程中發生的,你可以使用的JComponent.paintImmediately()方法之一。但是,您應該花一些時間首先決定是否可以重構代碼,以使start()功能在事件派發線程之外發生。

+0

你能解釋一下,爲什麼它應該在外面? – dantuch 2011-04-06 14:22:34

+0

通常情況下,事件調度線程(EDT)不應該保持繁忙,運行與UI無關的代碼。在這種特定情況下,不清楚'start()'方法在做什麼,所以只有@Maarten可以決定它是否可以從EDT移走。 – kschneid 2011-04-06 14:27:09

+0

好的提示。將UI保持在遊戲機制之外似乎確實是一個好主意。他們現在有點混亂起來。我想我應該在applet初始化時創建一個新線程? – Maarten 2011-04-06 15:19:26