2016-06-09 41 views
0

我是Java新手,在獲取某些代碼時遇到問題。我有一個字母A-Z的GUI。點擊按鈕後,我想要求一個Keyevent做幾件事:JavaFX在獲取僅一個字母數字字符後停止KeyEvent

  1. 只允許您選擇一個字母。大寫或小寫。如果不等待一個正確的迴應。
  2. 然後檢查字母表列表,看它是否被按下過。如果它再詢問另一個字母
  3. 如果輸入了一個新字符,請在字母表中輸出並運行以下方法
  4. 禁用任何其他鍵被按下。 我曾嘗試下面的代碼:

    private static void spinGame(){ 
    
         switch (wheelResult) 
    
         { 
          case "1' 
          ... 
    
          break; 
          case "2": 
          ... 
    
          break; 
    
          default: 
          System.out.println("..."); 
    
          newPhrase.gameB(); 
    
          scene2.setOnKeyPressed((KeyEvent event) -> { 
           if (event.getText().isEmpty()) 
            return; 
    
           char pressed = event.getText().toUpperCase().charAt(0); 
           userGuess=event.getText().charAt(0); 
    
           if ((pressed < 'A' || pressed > 'Z')) 
            return; 
    
    
            Text t = alphabet.get(pressed); 
           if (t.isStrikethrough()) 
             return; 
    
            // mark the letter 'used' 
           else{t.setFill(Color.BLUE); 
            t.setStrikethrough(true); 
    
            System.out.println(userGuess); 
            } 
            int letterCount; 
            if ((userGuess == 'a') || (userGuess == 'e') || (userGuess == 'i') || (userGuess == 'o') || (userGuess == 'u')){ 
    
             playerScores[currentPlayer] -= 250; 
             System.out.println("£250 docked from score for vowel use"); 
            } 
    

它從這裏錯了。我不想要按鍵再次按下,我不應該運行以下方法:

      letterCount = newPhrase.makeGuess(userGuess); 

          ...my method....; 
        }) 

我不知道如何解決它。我測試並記錄了用戶猜測正在被選中,但它不會繼續執行方法,輸入鍵也不會停止。我也覺得我的字母數字編碼是錯誤的。

+0

什麼你已經提供了看起來很好,雖然你可以做一些小的改變來濃縮它。除非您提供的代碼中沒有您遇到的問題?例如初始化「字母表」,我在測試時猜測 – Peter

+0

設置了字母表。它取消並罰款。問題是我想停止關鍵事件,直到調用它的方法再次運行。 – mineshmshah

+0

你的意思是你想在字母表中的每個字母都被正確猜測後停止檢查字母嗎? – Peter

回答

0

您的解決方案已經滿足您的要求,因爲您檢查一封有效的信件,以及它是否在您的字母表中穿透。因此,除非他們提供未使用的字母,否則除了每次檢查的條件外都不會發生任何事情

要停止鍵輸入,我建議使用ToggleButton或類似的東西,因此用戶必須指出他們想要猜測的時間。這意味着您可以使用其他基於文本的控件,並且意外降低字母表中的字母的可能性。當他們猜測一個未使用的字母時,您可以重置該按鈕,否則請繼續檢查其輸入是否有效。

只有當用戶輸入元音時,纔會調用與評分系統有關的方法。您可以通過創建一個方法,只給它提供了有效的未使用的字母分開的得分和輸入邏輯,處理本場比賽的得分/短語查找邏輯有:

private void checkPhrase(char chosenLetter){ 
    //Handle the Hangman-like logic here 
    boolean isVowel = vowels.indexOf(chosenLetter) >= 0; 
    if (isVowel) { 
     System.out.println("User provided a vowel"); 
    } 
} 

這將使它更容易閱讀和維護你的代碼一旦你確定這封信沒有被使用,你只需要調用一次。而就像是隻被元音


下面執行的,你可能有重複之前,因爲它看起來是在情況下進行測試時,我對你的代碼所做的更改他們使用的:

public class AlphabetGuess extends Application { 
    private String vowels = "AEIOU"; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     ObservableList<Text> alphabet = FXCollections.observableArrayList(); 

     for(char letter = 'A'; letter <= 'Z'; letter++){ 
      alphabet.add(new Text(String.valueOf(letter))); 
     } 

     HBox alphabetContainer = new HBox(5); 
     alphabetContainer.setAlignment(Pos.CENTER); 
     alphabetContainer.getChildren().addAll(alphabet); 

     ToggleButton button = new ToggleButton("Listen for guess"); 
     button.setSelected(false); 

     VBox root = new VBox(20, alphabetContainer, button); 
     root.setAlignment(Pos.CENTER); 

     Scene scene = new Scene(root, 500, 100); 
     scene.setOnKeyPressed(event -> { 
      //If the button isn't selected, don't process the input 
      if (event.getText().isEmpty() || !button.isSelected()) { 
       return; 
      } 

      char userGuess = event.getText().toUpperCase().charAt(0); 
      if ((userGuess < 'A' || userGuess > 'Z')) { 
       return; 
      } 

      //This will cause letters A-Z to become 0-25 allowing the list to be indexed 
      Text text = alphabet.get(userGuess - 'A'); 
      if (text.isStrikethrough()) { 
       System.out.println(userGuess + " has already been guessed"); 
       return; 
      } else { 
       text.setFill(Color.BLUE); 
       text.setStrikethrough(true); 
       checkPhrase(userGuess); 
      } 
      //Un-select button which will cause this event to reject incoming keys 
      button.setSelected(false); 
     }); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void checkPhrase(char chosenLetter){ 
     //Handle the Hangman-like logic here 
     boolean isVowel = vowels.indexOf(chosenLetter) >= 0; 
     if (isVowel) { 
      System.out.println("User provided a vowel"); 
     } 
     //ToDo: Implement 
    } 
} 
+0

所以我不確定切換按鈕會有很大的幫助,因爲程序的其餘部分被設置出來,所以會發生如下: 按下GUI上的按鈕 - >切換方法run-> In有些情況下,上面的方法應該運行一次,這將是新的字母值,監聽器需要停止,我認爲這裏的問題是return語句,我需要一種只接受一個按鍵的方式,這是一個沒有選擇的字母 – mineshmshah

+0

問題在於scene.setOnKeyPress位於一個方法中 – mineshmshah

+0

您的switch語句是否能夠確定何時再次偵聽?如果可以,則按鈕bas編輯邏輯可以刪除和模仿 – Peter

相關問題