首页 > 解决方案 > JavaFX、文本字段、事件处理程序

问题描述

我只是在学习 JavaFX 和看教程。它需要处理大量信息,所以我从一个简单的 BMI 计算器应用程序开始。我不包括 BMI 类,但它有一个构造函数:BMI(double height, double weight, String gender)

问题:

  1. 我的事件处理程序不工作。我尝试做与教程相同的操作,但无法正常工作。我尝试了一个简单的 Print if eventSource = button

  2. 所以我将有 3 个文本字段,用户在其中输入 3 个指定值,身高,体重性别。当用户这样做时,我想使用我的 BMI 类并使用这 3 个值创建一个新的 BMI。我找到了一个方法:“textfield.getAccesibleText(); 也许这可以工作,但我无法找到,因为我的事件处理程序不工作。

总而言之,用户应该在输入 3 个值后按下“计算”按钮,然后我将使用我的 Bmi 类创建一个 Bmi,并在新框中显示该 Bmi 的值。(我将不得不添加 Bmi 的框)稍后显示。

让 Eventhandler 工作,能够从文本字段(如扫描仪)中获取值,创建一个新的 Bmi,创建一个新框,我将在其中显示该 Bmi 的值。(我在我的 BMI 课程中有一个计算 BMI 的方法

public class Main extends Application  {
Button b1;
Button b2;
Text g;
Text w; 
Text h; 

TextField g1; 
TextField w1;
TextField h1; 
@Override


public void start(Stage stage) throws Exception{

 g = new Text("Gender:");
 w = new Text("Weight:");
 h = new Text("Height");
 g1 = new TextField();
 w1 = new TextField();
 h1 = new TextField();



b1 = new Button("Calculate BMI!");
b2 = new Button("Reset BMI");

GridPane grid = new GridPane();

grid.setMinSize(400, 200);

grid.setPadding(new Insets(10, 10, 10, 10));
  grid.setVgap(5); 
  grid.setHgap(5);

  grid.setAlignment(Pos.CENTER); 

  grid.add(g, 0, 0);
  grid.add(g1, 1, 0);
  grid.add(w, 0, 1);
  grid.add(w1, 1, 1);
  grid.add(h, 0, 2);
  grid.add(h1, 1, 2);
  grid.add(b1, 0, 3);
  grid.add(b2, 1, 3);

  b1.setStyle("-fx-background-color: purple; -fx-text-fill: white;"); 
  b2.setStyle("-fx-background-color: purple; -fx-text-fill: white;");
  grid.setStyle("-fx-background-color: GREEN;"); 

  Scene scene = new Scene(grid);

  stage.setScene(scene);

  stage.show();


}


public void handle(ActionEvent event){
    if(event.getSource() == b1){
    //do something
}
}



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



}}

标签: javajavafx

解决方案


似乎您有处理动作事件的方法,但处理程序本身从未附加到按钮或文本字段。为此,您需要提供一个EventHandler接口实现,例如:

button.addEventHandler(ActionEvent.ACTION, (ActionEvent event) -> {
    // your code here
});

有关更多详细信息,请参阅使用事件处理程序

然而,正如@kleopatra 提到的更好的做法是使用适当的setOnXxx()方法提供事件处理程序,例如:

button.setOnAction((ActionEvent event) -> {
    // your code here
});

您是否还知道如何“收集”文本文件中的用户输入,例如扫描仪,然后用它们创建一个新的 Bmi,最后将该数字显示在一个新框或类似的东西中。

这是您需要弄清楚业务模型以生成将保存来自控件的数据的类的部分。一个好的候选者是BmiDataPOJO,如下所示:

public class BmiData {

    private String gender;
    private Double height;
    private Double weight;

    // Constructor, getters and setters

    public Double calculateBmi() {
        // perform the calculation here
    }
}

然后附加到“计算 BMI”按钮的事件处理程序是将文本字段中的数据收集到一个BmiData对象中并最终将结果显示给用户的一个很好的候选者。我建议您研究 MVC(模型-视图-控制器)设计模式。


推荐阅读