2015-12-22 69 views
1

我想問用戶他們的性別。我想創建一個文本框,以便他們可以回答問題。「執行時」循環是爲了確保他們回答「男孩」或「女孩」。沒有錯誤,但不會運行。帶有數據驗證的文本框

注意我擁有所有必要的進口...

public class Culminating_JavaFX extends Application { 

    String gender; 

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     GridPane grid = new GridPane(); 
     TextField textField = new TextField(); 

     do 
     { 
      textField.setPromptText("Are you a boy or a girl?"); 
      textField.setText(""); 
      gender = br.readLine().toLowerCase(); 
     } 
     while (!(gender.equals("boy")) && !(gender.equals("girl"))); 

     GridPane.setConstraints(textField, 0, 1); 
     grid.getChildren().add(textField); 

    } 

    public static void main(String [] args) { 
     launch(args); 
    } 

} 
+2

請您總結一下你的問題的稱號,不是你的簡歷。 – luk2302

回答

2
public class Culminating_JavaFX extends Application { 

private GridPane grid = new GridPane(); 
private TextField textField = new TextField(); 
private Label label = new Label("Are you boy or girl?"); 
private Button btn; 

public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage) { 
    btn = new Button(); 
    btn.setText("Answer"); 

    // set action listener -> runs when button is pressed 
    btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      // process the form 
      process(); 
     } 
    }); 

    // set constraints 
    GridPane.setConstraints(textField, 0, 0); 
    GridPane.setConstraints(label, 0, 1); 
    GridPane.setConstraints(btn, 0, 2); 

    // add components to grid 
    grid.getChildren().add(textField); 
    grid.getChildren().add(label); 
    grid.getChildren().add(btn); 

    // show scene 
    primaryStage.setScene(new Scene(grid, 300, 250)); 
    primaryStage.show(); 
} 

private void process() { 
    // get text 
    String text = textField.getText(); 

    // process text 
    if (text.equals("boy")) { 
     label.setText("You are a boy."); 
    } else if (text.equals("girl")) { 
     label.setText("You are a girl."); 
    } 
}} 

image of required imports

我寫了一個簡單的例子,請上述檢查。你的程序進入了do-while循環並停留在那裏。它從來沒有達到它將繪製窗口和組件的地步。這就是爲什麼它不能運行。

+0

非常感謝你,你真的是一個拯救生命的人。 – Lia

0

請注意,從現在起,請儘量保持邏輯代碼和圖形用戶界面代碼儘可能分開。切勿嘗試將所有內容塞進GUI類。

接下來的事情是,GUI的一般想法是,他們的邏輯不能在運行之前在循環中綁定。當你的程序運行並調用start()時,它會向下執行並執行代碼,並且需要命中window.show();。這將窗口顯示給用戶。如果你的程序停留在上面的那個循環中,它甚至不能夠將GUI顯示給用戶,因此將無法工作。

相反,重新考慮你的程序將如何工作。由於用戶需要選擇男孩或女孩,爲什麼不使用ChoiceBox,或更好的是RadioButton。有用戶選擇他們想要的選擇,那麼也許有Button爲他們點擊通過調用提交或有ChoiceBoxRadioButton監聽變化:

yourRadioButton.setOnAction(e -> 
{ 
    /* 
    * Set the Boy Girl value here by calling 
    * yourRadioButton.getValue() 
    */ 
} 
+0

這是非常豐富和有益的,非常感謝你! – Lia