2015-05-06 97 views
0

我已經在Java上創建了通用戰艦遊戲,並且包含了下面的代碼片段。我以與在GUI上使用控制檯相同的方式獲取用戶輸入,我有一個JLabel充當打印語句,一個JTextField接受用戶輸入,然後一個JButton來「提交」輸入。停止Java Swing在沒有用戶輸入的情況下執行

問題是因爲我創建的程序首先在沒有GUI的情況下工作,現在正在將其轉換爲程序,我認爲動作偵聽器正在逃離自己。我已經在用戶輸入船舶位置的地方開始了代碼片段,他們已經選擇了他們想要的每種類型船隻的數量。在這一點上,儘管我希望用戶輸入例如1(選擇水平),然後A4以A4開始船舶,在此之後,程序將保持循環直到所需數量的船舶已經放置。

但是,程序改爲向前跳躍,從不提示用戶輸入方向並將標籤更改爲「輸入猜測」(在CPU船上拍攝的下一個方法),並且控制檯打印出 「您想要船嗎? ?子水平或垂直 對於水平進入1號 或者垂直輸入數字2: 的CPU鏡頭是在42 CPU的出手的結果:錯過 輸入一個猜測」 本質上跳過來自用戶的任何輸入至於位置或方向,正如我所說,我認爲這可能是由於行動監聽器,雖然我不確定,理想情況下,程序將運行,並且一達到任何label1.getText();程序會「暫停」直到用戶輸入文本,然後按下提交按鈕,然後繼續運行。

所以我的問題是有沒有將這個「破發」或‘暫停’入代碼,而無需改變整個程序的方式嗎?

for (int i = 0; i < ship.size(); i++) 
     { 
      final int shipNumber = i; 
       while (!worked) 
       { 
        playerLocationToSet.clear(); 
        worked = true; 
        label1.setText("Would you like the ship " + ship.get(shipNumber).getName() + " horizontal(enter 1) or vertical(enter 2) ?"); 
        System.out.println("Would you like the ship " + ship.get(shipNumber).getName() + " horizontal or vertical ?"); 
        System.out.println("For horizontal enter number 1"); 
        System.out.println("Or for vertical enter number 2: "); 
        button1.addActionListener(new ActionListener(){ 
         public void actionPerformed(ActionEvent f){ 
          int addLetter; 
          int addNumber; 
         String orientString = textField1.getText(); 
          int orient = Integer.parseInt(orientString); 
          // horizontal 
        if (orient == 1) 
        { 
         addLetter = 0; 
         addNumber = 1; 
        } 
        // vertical 
        else if (orient == 2) 
        { 
         addLetter = 1; 
         addNumber = 0; 
        } 
          int letterNumber = 0; 
          label1.setText("Where would you like to start " + ship.get(shipNumber).getName() + "?"); 
          String start = textField1.getText(); 
          start = start.toUpperCase(); 
          int letter = start.charAt(0); 
          int number = start.charAt(1) - 48; 
          for (int x = 0; x < alphabet.length; x++) 
          { 
           if(alphabet[x] == letter) 
            { 
             letterNumber = x + 1; 
            } 
          } 
          for (int j = 0; j <ship.get(shipNumber).getSize(); j++) 
          { 
           String position = "" + letterNumber + number; 
           playerLocationToSet.add(position); 
           letterNumber = letterNumber + addLetter; 
           number = number + addNumber; 
           for (int t = 0; t < ship.size(); t++)      } 
        }); 
        ship.get(i).setLocation(playerLocationToSet); 
       } 
     } 
    } 

    private void playerShoot() 
    { 
     String guess; 
     String result; 
     char[] alphabet = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 
     char letter; 
     int number; 
     int guessLetter = 0; 
     String finalGuess; 
     while (!CPUship.isEmpty()) 
     { 
      result = "miss"; 
      label1.setText("Enter a guess"); 
      System.out.println("Enter a guess"); 
      guess = textField1.getText(); 
      guess = guess.toUpperCase(); 
      letter = guess.charAt(0); 
      number = guess.charAt(1) - 48; 

道歉這麼長的問題,我想嘗試使它儘可能清晰。隨意問任何問題,無疑我錯過了一些東西。提前 感謝

+0

事件驅動的GUI編碼需要與您的程序完全不同的方法,並且如果您的控制檯程序沒有正確完成(例如,沒有像樣的OOP兼容類),那麼通常最好的做法是僅僅取消線性控制檯類型代碼並使用符合OOP的模型類重寫它,其中包含更改狀態的方法以及事件驅動的GUI代碼,以允許用戶與模型進行交互。 –

+0

請勿使用「代碼段」按鈕來標記代碼。只需使用'{}'按鈕。 – camickr

+0

例如,'while(!worked)'類型的循環對於GUI不起作用,不應該在那裏。請注意,它可能會導致輸入Swing事件線程,從而凍結程序。我同意@ camickr的回答(1+),但仍然建議你重寫。這些巨大的方法應該完全重新考慮因素,因爲這樣做會使您的代碼更具可讀性和可調試性,不僅適用於我們,也適用於您。 –

回答

3

是有這個插入「破發」或‘暫停’

的方式

沒有看代碼或代碼的結構,但一般來說,您將使用JOptionPane來提示用戶輸入。這將創建一個模態JDialog,它將停止處理,直到關閉對話框。

閱讀有關How to Make Dialogs的Swing教程的部分以獲取更多信息和示例。

相關問題