2012-09-08 44 views
1

我不知道我的程序有什麼問題。我認爲這可能是線程的問題,即使我沒有創建線程。我有三個不同的類來實施遊戲掃雷。一個是用於81(9 x 9)按鈕的擴展JButton類MineButton。第二個是包含MineButton的擴展Container類MineField。然後我有包含MineField對象的班級掃雷。我有很多工作。現在我想要做的是讓Minewseeper類從MineButton類訪問靜態信息。在這裏,我不知道該怎麼做。之後(我相信)該字段和按鈕被初始化並準備好顯示。我將Minesweeper對象發送到一個無限循環來不斷更新MineButton類的信息。當我這樣做時,Applet彈出,但不顯示其內容。 showStatus顯示零。這應該是什麼。 感謝您的幫助。JApplet顯示

這裏是掃雷類

public class Minesweeper extends JApplet 
    { 
     MineField field; 
     public void init() 
     { 
      field = new MineField(9,9); 
      getContentPane().add(field); 
      setSize(field.getSize()); 
     } 

     public void start() 
     { 
      // trying to fix my problem. Wondering if not ready for display 
      field.setNumbers(); 
      while(!field.initialized()); 


      while(true) 
      { 
       showStatus(MineButton.flagCount + ""); 
      } 
     } 
    } 
+0

是什麼'場=新井田(9,9);'怎麼辦?我和現場之間有一個空間 –

+0

在我的實際程序中它是單間隔的。它創建並設置UI。該字段是MineButton的容器。當我沒有while(true)循環時,它可以很好地工作。 – user1266174

回答

3

你可以做的是添加刷新狀態之間有一些延遲最少。現在你需要整個CPU,除了忙於等待是一個非常糟糕的練習之外,擺動線程無法跳入並繪製你的東西。

while(true) { 
    showStatus(MineButton.flagCount + ""); 

    try { 
     Thread.sleep(1000); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Str.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

一個更好的解決辦法是建立一個計時器,所以代替while循環:

int delay = 1000; //milliseconds 
ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     showStatus(MineButton.flagCount + ""); // need to make sure that you can call showStatus 
    } 
}; 

new javax.swing.Timer(delay, taskPerformer).start(); 
+0

感謝您的想法。這可能是問題的一部分,但它仍然不起作用。 – user1266174

+0

我剛剛閱讀並嘗試了評論的第二部分。它工作完美。你能給我一個解釋爲什麼一個人工作,另一個沒有。也許一個網站閱讀更多的自己?非常感謝。 – user1266174

+1

我可以爲您提供一些可能解釋它的文檔。 '初始化後執行任務的每個小程序(除了直接響應用戶操作)必須覆蓋啓動方法。 start方法開始執行applet。從啓動方法快速返回是一種很好的做法。如果你需要執行計算密集型操作,那麼爲此目的開始一個新線程可能會更好。「顯然,你不應該在'start()'中做很多事情。 'Timer'將在其自己的線程中運行,不會干擾該小程序的主線程。 –