因此,我寫了一個小程序,它將移動圓周,當它們碰撞時它們會向相反的方向移動,但是當我試圖延遲執行時,它們不會快速移動,我得到java.lang.IllegalMonitorStateException
鎖定在canvasRender.java,創建一個實例:更改所有者爲ReentrantLock
ReentrantLock renderLock = new ReentrantLock();
方法,將暫停執行了一會兒,所以圈子不能走動超級快。
publlic void delay(){
renderLock.unlock();
try { Thread.sleep(10); } catch (Exception e) {} ;
renderLock.lock();
}
然後從那裏我創建一個窗口,並添加的ActionListener另一個類
public static void main(String[] args){
//Buttons and other elements
// ...
JButton start = new JButton("Start!");
createAndShowGUI();
}
在createAndShowGUI():
static void createAndShowGUI(){
//adding elements to panels
start.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
start(); //this will set gameIsRunning variable to true and create models
while (gameIsRunning) {
//update(); //which has delay(); at the end of frame drawing
//but even if just put delay()
delay(); //still says exception
start.setEnabled(false); //while game is running button is unavailable
}
start.setEnabled(true);
}
});
}
在這種情況下,我的鎖由Thread main
擁有,但當我點擊按鈕'開始!'時當前是Thread AWT-EventQueue-0
,所以程序崩潰。如何解決這個問題? (或我在哪裏愚蠢?)
聖,這是很多的幫助!當屏幕上繪製大量對象時,我使用ReentrantLock減少閃爍。如果我使用同步而不是鎖定,你認爲問題會持續嗎? –
我不是專家,尤其是使用圖形用戶界面,但同步/鎖定是關於控制對共享資源的訪問 - 可能與您的案例中的閃爍無關。我會看看[這個答案](https://stackoverflow.com/a/17966278/1232459)。也許你應該開始不經常地更新UI。如果您將GUI更新與遊戲狀態更新分開,可能會更容易管理 - 例如在run()的頂部聲明'long lastUIUpdateTime = 0',並且只觸發UI更新if(System.currentTimeMillis() - lastUIUpdateTime> 40)'。 (當然,當你這樣做的時候更新'lastUIUpdateTime'。) – rjb1290