2016-06-09 29 views
0

Ich bin neu in Java und habe Probleme, Code zum Laufen zu bringen. Ich habe eine GUI mit den Buchstaben A-Z. Nach einem Klick auf die Schaltfläche möchte ich ein Keyevent bitten, ein paar Dinge zu tun:JavaFX stop KeyEvent nach Erhalt nur eines alphanumerischen Zeichens

  1. Nur erlauben, einen Buchstaben auszuwählen. Groß- oder Kleinschreibung. Warten Sie nicht auf eine korrekte Antwort.
  2. Dann überprüfen Sie die alphabetische Liste, um zu sehen, ob es zuvor gedrückt wurde. Wenn ja, fragen Sie nach einem anderen Buchstaben
  3. Wenn ein neues Zeichen eingegeben wird, dann streichen Sie es auf dem Alphabet und führen Sie die folgende Methode aus
  4. Deaktivieren Sie alle weiteren Tasten gedrückt. Ich habe den folgenden Code versucht:

    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"); 
            } 
    

Es geht von hier falsch. Ich möchte nicht, dass Tasten erneut gedrückt werden und ich nicht die folgende Methode ausführen sollte:

      letterCount = newPhrase.makeGuess(userGuess); 

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

Ich habe keine Ahnung, wie Sie es beheben. Ich habe getestet und aufgezeichnet, dass die Benutzerschätzung ausgewählt wurde, aber die Methode wird nicht fortgesetzt, und die Eingabe wird nicht beendet. Ich finde auch, dass meine Codierung für das alphanumerische Zeug falsch ist.

+0

Was Sie Habe dafür gesorgt, sieht gut aus, obwohl es ein paar kleine Änderungen gibt, die man machen kann, um es zu verdichten. Es sei denn, das Problem, das Sie haben, liegt nicht in dem von Ihnen bereitgestellten Code? ZB Initialisierung "Alphabet", die ich beim Testen erraten habe – Peter

+0

Das Alphabet ist eingerichtet. Es hebt ab und funktioniert gut. Das Problem ist, dass ich das Schlüsselereignis anhalten möchte, bis die Methode, die es aufruft, erneut ausgeführt wird. – mineshmshah

+0

Wollen Sie damit aufhören, die Buchstaben zu prüfen, nachdem jeder Buchstabe im Alphabet korrekt erraten wurde? – Peter

Antwort

0

Ihre Lösung entspricht bereits Ihren Anforderungen, wenn Sie nach einem gültigen Buchstaben suchen und überprüfen, ob dieser in Ihrem Alphabet durchgestrichen ist. Also, bis sie einen unbenutzten Brief liefern, wird nichts passieren außer den Bedingungen überprüft jedes Mal

Um die Tasteneingabe zu stoppen, würde ich empfehlen, eine ToggleButton oder etwas ähnliches zu verwenden, so muss der Benutzer angeben, wenn sie raten möchten. Dies bedeutet, dass Sie andere textbasierte Steuerelemente mit einer geringeren Wahrscheinlichkeit verwenden können, versehentlich Buchstaben in Ihrem Alphabet zu entfernen. Wenn sie einen unbenutzten Buchstaben erraten, können Sie die Taste zurücksetzen, ansonsten überprüfen Sie ihre Eingabe auf einen gültigen Buchstaben

Ihre Methode in Bezug auf das Scoring-System wird nur aufgerufen, wenn ein Vokal vom Benutzer eingegeben wurde. Sie können die Partitur und Eingabelogik trennen, indem ein Verfahren zu schaffen und nur dann gültig, nicht genutzte Buchstaben zur Datei angeben, das Kerb/Phrase-Lookup-Logik des Spiels Umgang dort:

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"); 
    } 
} 

Dies macht es einfacher, Ihren Code zu lesen und zu pflegen als Sobald Sie festgestellt haben, dass der Brief nicht verwendet wurde, müssen Sie ihn nur einmal anrufen. Während vor Vervielfältigung gehabt haben könnte, da es, wie es nur die Änderungen, die ich an Ihrem Code werden für die Vokale


Unten ausgeführt worden war aussieht, wenn bei Prüfung sind sie für die Verwendung:

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

So bin ich mir nicht sicher, dass die Umschalttaste würde viel helfen aufgrund der Art und Weise, wie der Rest des Programms eingerichtet ist.so was passiert, ist wie folgt: Tasten auf der GUI gedrückt -> eine Wechselmethode run -> In In einigen Fällen sollte die obige Methode einmal ausgeführt werden Dies wäre der neue Wert des Buchstabens Der Listener muss aufhören Ich denke, das Problem sind die Return-Anweisungen Ich brauche nur eine Taste gedrückt zu haben, die ein nicht gewählter Buchstabe ist – mineshmshah

+0

Das Problem ist, dass die scene.setOnKeyPress in einer Methode sitzt .. – mineshmshah

+0

Ist Ihre Switch-Anweisung in der Lage zu bestimmen, wann wieder zu hören? Wenn es kann, dann die Schaltfläche bas ed Logik kann entfernt und nachgeahmt werden – Peter