2012-09-20 100 views
1

我正在用java編程一個國際象棋遊戲,此刻我正在構建一個基本界面。它只是一個8x8的按鈕陣列,將顯示在窗口中。我已經爲這些按鈕編碼,並且已經讓電路板正確顯示。但是,當我將其與遊戲的其餘部分連接起來時,遊戲窗口在運行時崩潰,我必須強制退出Java應用程序。這是我的代碼:Java Swing框架在打開時崩潰?

package Chess_Game; 
import javax.swing.SwingUtilities; 
import Chess_Interface.Iboard; 

public class Game_Tester 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
        Game G = new Game(); 
        Iboard I = new Iboard(G.getBoard().getArray(), G.getSides()); 
        I.setVisible(true); 
        while(!(G.isGameOver())) 
        { 
         boolean redo = true; 
         while(redo) 
         { 
          int row = 0; 
          int col = 0; 
          int nRow = 0; 
          int nCol = 0; 
          System.out.println("Click the piece you want to move."); 
          while(!(I.getBool())){} 
          if(I.getBool()) 
          { 
           row = I.getRow(); 
           col = I.getCol(); 
           I.setBool(false); 
          } 
          System.out.println("Click the place you want to move to."); 
          while(!(I.getBool())){} 
          if(I.getBool()) 
          { 
           nRow = I.getRow(); 
           nCol = I.getCol(); 
           I.setBool(false); 
          } 
          if(G.canMove(row, col, nRow, nCol)) 
          { 
           G.move(row, col, nRow, nCol, I); 
           redo = false; 
          } 
          else 
          { 
           System.out.println("You cant move there! Try again!"); 
          } 
         } 
         I.updateBoard(G.getBoard().getArray(), G.getSides()); 
        } 
      } 
     }); 
    } 
} 

董事會正常顯示,當我註釋掉主while循環(和一切在它的內部),我認爲問題在於某處裏面就有,但我一直無法找到它。我也在網上尋找類似的遊戲循環問題,但所有這些都是針對涉及幀速率和跨越java swing框架的移動的遊戲,這些並不存在於我的代碼中。

任何幫助將不勝感激。

+2

1)請學習常見的[Java命名約定](http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#73307)(具體用於名稱的情況)爲類,方法和屬性名稱並一致使用它。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

4

你有幾個圈,如

while(!(I.getBool())){} 

這有可能永遠運行下去,如果I預期不響應。您可以先在這些循環內打印出一些內容,然後在以下塊if(I.getBool()){...}中查看您的應用程序在什麼時候卡住。

在這樣的循環中檢查用戶界面不是很好的做法。最好使用Listeners來響應用戶界面。

即使使用SwingUtilities.invokeLater(new Runnable()也不會在Swing線程上運行主應用程序,即使它避免了從另一個線程更新GUI的潛在問題。

事實上,這可能是你的根本問題,因爲像這樣在Swing線程(用於運行GUI的線程)上運行主應用程序循環可能會阻止GUI正常響應。您正在將任務(整個遊戲)放到GUI的隊列中,但該任務永遠不會完成while(!(G.isGameOver()))

+0

非常感謝您的幫助,非常感謝。 –