2016-06-09 8 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의 버튼 눌렀습니다 -> 스위치 메소드 실행 -> 있음 어떤 경우 위의 메서드를 한 번 실행해야합니다.이 새 문자 값을 것입니다. 청취자가 중지해야합니다. 여기에 문제가 반환 문을 것 같아요. 내가 선택한 하나의 키를 수락 할 수있는 방법이 필요합니다. before. – mineshmshah

+0

문제는 scene.setOnKeyPress가 메서드에 위치한다는 것입니다. – mineshmshah

+0

switch 문이 다시 청취 할 때를 결정할 수 있습니까? 가능한 경우 버튼이 기본이됩니다. 에드 로직을 제거하고 거기에서 흉내낼 수 있습니다. – Peter