Как передать информацию TextField в метод handle () - PullRequest
0 голосов
/ 08 февраля 2020

Вопрос для начинающих: последняя часть моего задания - изменить метод handle (), чтобы при нажатии кнопки он возвращал результат для калькулятора миль на галлон. Как получить пользовательский ввод из текстовых полей mi и gal, когда эта часть закодирована вне метода handle?

public class MPGApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Miles Per Gallon");

        Button btn = new Button("Calculate");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_LEFT);
        hbBtn.getChildren().add(btn);
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {

            }
        });

        GridPane root = new GridPane();
        root.setAlignment(Pos.TOP_CENTER);
        root.setHgap(10);
        root.setVgap(10);
        root.setPadding(new Insets(25, 25, 25, 25));
        root.add(hbBtn, 1, 3);

        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);

        Label miles = new Label("Miles:");
        root.add(miles, 0, 0);
        Label gallons = new Label("Gallons:");
        root.add(gallons, 0, 1);
        Label mpg = new Label("MPG:");
        root.add(mpg, 0, 2);

        TextField mi = new TextField();
        root.add(mi, 1, 0);
        TextField gal = new TextField();
        root.add(gal, 1, 1);
        TextField gpm = new TextField();
        gpm.setEditable(false);
        root.add(gpm, 1, 2);

        primaryStage.show();
    }

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

}

Ответы [ 2 ]

4 голосов
/ 08 февраля 2020

Вы можете объявить и инициализировать TextFields над setOnAction методом Button, который сделает экземпляр TextField видимым для метода-обработчика кнопки.

Или для улучшения читабельности - просто переместите метод обработки вниз:

btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println(mi.getText());
        System.out.println(gal.getText());
        System.out.println(gpm.getText());
    }
});
primaryStage.show();

Дело в том, что локальные переменные метода должны быть объявлены (и главным образом инициализируется), прежде чем делать какие-либо ссылки на них (т.е. использовать их).

Где в классе вы могли бы объявить члены внизу определения класса (но практика - объявлять их сверху).

0 голосов
/ 08 февраля 2020
@Override
public void start(Stage primaryStage) {
GridPane root = new GridPane();
root.setAlignment(Pos.TOP_CENTER);
root.setHgap(10);
root.setVgap(10);
root.setPadding(new Insets(25, 25, 25, 25));


Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);

Label miles = new Label("Miles:");
root.add(miles, 0, 0);
Label gallons = new Label("Gallons:");
root.add(gallons, 0, 1);
Label mpg = new Label("MPG:");
root.add(mpg, 0, 2);

TextField mi = new TextField();
root.add(mi, 1, 0);
TextField gal = new TextField();
root.add(gal, 1, 1);
TextField gpm = new TextField();
gpm.setEditable(false);
root.add(gpm, 1, 2);


primaryStage.setTitle("Miles Per Gallon");

Button btn = new Button("Calculate");
HBox hbBtn = new HBox(10);
hbBtn.setAlignment(Pos.BOTTOM_LEFT);
hbBtn.getChildren().add(btn);
btn.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        double temp = Integer.parseInt(mi.getText());
        double temp2 =Integer.parseInt(gal.getText());
        String temp3=Double.toString(temp/temp2);
        gpm.setText(temp3);
    }
});
root.add(hbBtn, 1, 3);`
primaryStage.show();
}

// сначала создаем все метку и сцену, затем сообщаем кнопке о необходимости выполнения деления

...