2012-03-27 138 views
-2

我建立了一個Reversi程序,我需要延遲程序的每個圖像開關之間的時間爲0.5秒(從黑到白,在Eat函數中),問題在於使用線程不起作用,把變量和我得到錯誤的結果。我需要一些wat來延遲程序而不使用線程。這裏是你需要它的功能。延遲一個java程序

public void func1(int turn) 
{ 
    int i,k; 
    for(i=0;i<8;i++) 
    for(k=0;k<8;k++) 
    { 
    if(eat[i][k]==turn) 
    { 
     board[i][k]=turn; 
     if(turn==1) 
      squares[i][k].setIcon(new ImageIcon("blkimg.PNG")); 
     else 
      squares[i][k].setIcon(new ImageIcon("whtimg.PNG")); 
    } 
    } 
} 

非常感謝。

+0

Java(來自問題的標題),我添加了標記:) – 2012-03-27 01:26:12

+0

當你使用Thread.sleep()時什麼「混亂」? – Exupery 2012-03-27 01:27:19

+0

我試圖創建另一個線程,但兩個線程使用相同的變量,所以它沒有「翻轉」正確的作品 – Sagi 2012-03-27 01:42:46

回答

1

你不需要線程的豐富知識,將當前使用一個Thread.sleep()睡覺 - 我建議考慮看看http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html

+0

它並沒有一個一個「翻轉」它們。例如:如果我需要翻轉5塊,所以他等待5 * 0.5秒,然後將它們全部翻轉。 – Sagi 2012-03-27 01:35:07

+0

你叫什麼睡覺? 'Thread.sleep(500);'if(turn == 1)'應該在你想要的內容之前執行。 – Exupery 2012-03-27 01:48:21

+0

我在「board [i] [k] = turn」之前叫過它;「 – Sagi 2012-03-27 01:50:02

-1

我錯過了什麼嗎?爲什麼不能只使用Thread.sleep()來讓當前線程進入休眠狀態?

針對討論中的意見:

你需要掌握GUI線程的想法。如果你所有的代碼都在GUI線程上執行,GUI將不會被「重新繪製」。快速而骯髒的解決方法是根據需要將必要的調用強制重新繪製。

+0

1 。我真的是新的線程,並不真正知道如何使用它們,但我確實嘗試了睡眠func,並有一個問題,它沒有「翻轉」所有的部分,只有第一個。 – Sagi 2012-03-27 01:28:41

+1

你有一個真正的多線程應用程序,或使用Thread.sleep()沒有解決您的問題? Thread.sleep()不創建新的線程等,它只是讓當前的一個睡覺(這是你的問題要求)。也許你問的是錯誤的問題?爲什麼你甚至認爲你需要延遲? – John3136 2012-03-27 01:33:42

+0

延遲是非常重要的,如果程序一次全部翻轉,所以用戶無法真正瞭解計算機做了什麼動作。 – Sagi 2012-03-27 01:37:29

1

如果我是正確的你是一個常見的問題。

使用Thread.sleep()可能會在Swing使用的同一個線程中改變界面(這通常顯示在界面中不反應,然後一次顯示所有更改)中導致延遲。

您可以在Java教程中閱讀關於Concurrency in Swing的更多信息。

解決方案可能是使用SwingWorker類,幾個月前我爲朋友創建了一個小樣本。它是available in GitHub。如果你不使用Netbeans,只需看看this class(第90-98行和第151-165行)。

編輯:調整以反映這只是一個可能的解決方案。正如其他人指出的,至少有另一個好的選擇。

+0

我想這可能是問題,難以解決? – Sagi 2012-03-27 01:52:50

+1

更好地使用Swing Timer來處理這個簡單的延遲,而不是經歷SwingWorker的所有麻煩。 – 2012-03-27 02:06:32

+0

我不知道如何使用這些......這看起來很愚蠢,我只需要做一些簡單的0.5秒延遲。 – Sagi 2012-03-27 02:12:20

2

這看起來是一個Swing應用程序(你絕不會說,這是非常重要的信息。如果是這樣,只需使用Swing Timer創建延遲。另外,不要繼續閱讀中的圖像文件。閱讀他們只在一次,創建您的圖像圖標一次,也許在一個類的構造函數,並將ImageIcons保存到變量或數組或集合。

+0

謝謝,它的一種解決了我的問題,但另一個出現了。該程序不會翻轉它應該的所有部分,只是第一個。我在「if(turn == 1)」之前放置了「ActionListener taskPerformer = new ActionListener(){public void actionPerformed(ActionEvent evt){」,並且我放置了「timer2.stop();}; timer2 =新的計時器(200,taskPerformer); timer2.start();「在「squares [i] [k] .setIcon(new ImageIcon(」whtimg.PNG「));」之後「。 – Sagi 2012-03-27 12:39:59

+0

@Sagi:不要試圖在評論中發佈代碼,因爲正如你所看到的,它不會保留它的格式並且變得不可讀。相反,編輯你的原始問題,並將你的新代碼和解釋添加到原始問題的底部,然後評論我,讓我知道看看它。祝你好運! – 2012-03-27 14:02:22

+0

@Sagi:另外,*你究竟是否想要延遲?你能詳細描述一下方法和延遲應該做什麼嗎?假設我對你的遊戲一無所知。 – 2012-03-27 14:41:40