2017-12-15 31 views
-1

現在、Textadventureに取り組んでおり、コンソールからScenebuilderを使ってJavaFXに移動することに決めました。私は、出力にはTextView、入力にはTextFieldを使用しています。 これは私のコードがどのように見えるかです:TextFieldの入力待ちメソッドを効率的に実装するには? (JavaFX)

public class Story implements Initializable { 
    public Button startButton; 
    public TextArea textArea; 
    public TextField textField; 
    public EventHandler mainplot; 

    //On startButton pressed 
    public void startGame() { 
     setEventFilters(); 
     begin(); 
    } 

    public void begin() { 
     print("Welcome to the Adventure."); //print is a method for appending String to textArea 
     print("You wake up in your room."); 
     print("Fresh air blows through your window."); 
     print("You get up. What do you want to do?"); 
     print("1. Drink from the magical can."); 
     print("2. Go outside."); 
     textField.addEventFilter(ActionEvent.ACTION, mainplot); 
    } 

    public void magicalCan() { 
     ... 
    } 

    public void goOutside() { 
     ... 
    } 

    public void setEventFilters() { 
     //mainplotFilter 
     mainplot = new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent e){ 
       if(textField.getText().equals("1")) { 
        textField.removeEventFilter(ActionEvent.ACTION, mainplot); 
        magicalCan(); 
       } 
       if(textField.getText().equals("2")) { 
        textField.removeEventFilter(ActionEvent.ACTION, mainplot); 
        goOutside(); 
       } 
      } 
     }; 
    } 

コードは同じスキームで継続 - 意思決定とストーリーのためのより多くの方法のためのより多くのEventfilters。今let'sは、私はストーリーライン内に複数のEnterキーの入力を追加したいと言う:

public void begin() { 
     print("Welcome to the Adventure."); 
     //wait for enter to continue 
     print("You wake up in your room."); 
     print("Fresh air blows through your window."); 
     print("You get up. What do you want to do?"); 
     //wait for enter to continue 
     print("1. Drink from the magical can."); 
     print("2. Go outside."); 
     textField.addEventFilter(ActionEvent.ACTION, mainplot); 
    } 

のEventHandlerまたはすべてのストーリーの方法で使用できるwaitForEnterkey()メソッドを実装するための最も効率的な方法は何ですか?

+1

なぜ20-30イベントハンドラが必要なのですか?ストーリーラインの状態に基づいて意思決定を行うことができるハンドラは、より良いアプローチになります。 – Geoff

+0

これを試す前に簡単な 'JavaFX'チュートリアルを行います。 [ここ](http://tutorials.jenkov.com/javafx/textfield.html)を開始してください。 'Textfield'の仕組みを理解していない。 – Sedrick

+0

私は私の質問を明確にしました。どうぞご覧ください。 – Andrenergy

答えて

0

"ActionListener"をテキストフィールドに追加します。テキストフィールドにフォーカスがあり、ユーザーがを入力すると、と入力するとイベントが発生します。テキストを取得するには、

textField.getText(); 

を入力し、使用しているEventFilterと一致させることができます。

+0

私の質問を明確にしました。どうぞご覧ください。 – Andrenergy

1

ここでは、何をしようとしているのかの例を示します。これは質問をして、物語を語っていないが、これを行うためのプログラミングの考え方は非常に似ている。

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* 
* @author blj0011 
*/ 
public class JavaFXApplication71 extends Application 
{ 

    String[] questionBank = 
    { 
     "Connie has 15 red marbles and 28 blue marbles. How many more blue marbles than red marbles does Connie have?", 
     "Connie has 15 red marbles and some blue marbles. She has 13 more blue marbles than red ones. How many blue marbles does Connie have?", 
     "Connie has 28 blue marbles. She has 13 more blue marbles than red ones. How many red marbles does Connie have?" 
    }; 
    String[] correctAnswer = 
    { 
     "28 - 15 = 13", "15 + 13 = 28", "28 - 13 = 15" 
    }; 
    String[] answer1Bank = 
    { 
     "28 - 15 = 13", "28 - 13 = 15", "28 - 13 = 15" 
    }; 
    String[] answer2Bank = 
    { 
     "15 + 13 = 28", "15 + 13 = 28", "28 - 15 = 13" 
    }; 
    int currentQuestionCounter = -1;//Keeps up with what question is currently being asked 

    TextArea storyScreen = new TextArea(); 
    TextField userInput = new TextField(); 
    Button btnStart = new Button(); 

    @Override 
    public void start(Stage primaryStage) 
    { 
     storyScreen.setWrapText(true);//Wrap the text in the TextArea 
     storyScreen.setEditable(false);//Don't allow useInput in the storyScreen 

     userInput.setOnAction(actonEvent ->//Retrieve user Input on Enter pressed 
     { 
      TextField tempUserInput = (TextField) actonEvent.getSource();//get a reference to the userInput TextField. 
      switch (tempUserInput.getText())//Switch on that input 
      { 
       case "1": 
        if (answer1Bank[currentQuestionCounter].equals(correctAnswer[currentQuestionCounter])) 
        { 
         storyScreen.appendText("\n\nYou got this right!"); 
         btnStart.setDisable(false); 
        } 
        else 
        { 
         storyScreen.appendText("\n\nYou got this wrong!"); 
        } 
        break; 
       case "2": 
        if (answer2Bank[currentQuestionCounter].equals(correctAnswer[currentQuestionCounter])) 
        { 
         storyScreen.appendText("\n\nYou got this right!"); 
         btnStart.setDisable(false); 
        } 
        else 
        { 
         storyScreen.appendText("\n\nYou got this wrong!"); 
        } 
        break; 
       default: 
        storyScreen.appendText("\n\nYou have to enter a 1 or 2!"); 
        userInput.setText(""); 
      } 
     }); 

     btnStart.setText("Start"); 
     btnStart.setOnAction(actionEvent -> 
     { 
      btnStart.setText("Next"); 
      btnStart.setDisable(true); 
      userInput.requestFocus();//Move the cursor to the userInput TextField 
      getCurrentQuestionSetup(++currentQuestionCounter); 
     }); 

     VBox root = new VBox(); 
     root.getChildren().addAll(storyScreen, userInput, btnStart); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     launch(args); 
    } 

    void getCurrentQuestionSetup(int currentQuestion) 
    { 
     if (currentQuestion < questionBank.length) 
     { 
      userInput.setText("");//reset the TextField 
      storyScreen.clear();//reset the TextArea 

      //Add new Question and answer to Textarea 
      storyScreen.setText(questionBank[currentQuestion]); 
      storyScreen.appendText("\n\n1: " + answer1Bank[currentQuestion]); 
      storyScreen.appendText("\n2: " + answer2Bank[currentQuestion]); 
     } 
     else 
     { 
      storyScreen.appendText("\n\nYou have completed this story!"); 
      userInput.setText(""); 
      btnStart.setText("Start"); 
      btnStart.setDisable(false); 
      currentQuestionCounter = -1; 
     } 
    } 
} 
+0

私がこれをやっていたら、私の物語を各部分についての情報で部分的に保存する 'SQLite'データベースがあります。私は各ストーリーパートのオブジェクトの 'List'を作成します。正しいストーリーパートを取得するためのハンドラクラスを作成します。 – Sedrick

関連する問題