Untitled

Anonymous
plain_text
02/28/2026 10:48 AM
9.0 KB
12
Indexable
package com.example.bmippmcpmgui;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.util.Locale;

public class KalkulatorZdrowiaApp extends Application {

    enum Aktywnosc {
        SIEDZACY("siedzący", 1.2),
        UMIARKOWANY("umiarkowany", 1.375),
        AKTYWNY("aktywny", 1.55),
        BARDZO_AKTYWNY("bardzo wysoka aktywność", 1.725),
        EKSTREMALNY("ekstremalnie aktywny", 1.9);

        final String nazwa;
        final double wsp;

        Aktywnosc(String nazwa, double wsp) {
            this.nazwa = nazwa;
            this.wsp = wsp;
        }

        @Override
        public String toString() {
            return nazwa;
        }
    }

    enum Plec {
        K, M
    }

    @Override
    public void start(Stage stage) {

        TextField tfWaga = new TextField();
        TextField tfWzrost = new TextField();
        TextField tfWiek = new TextField();

        tfWaga.setPromptText("kg");
        tfWzrost.setPromptText("cm");
        tfWiek.setPromptText("lata");

        tylkoLiczby(tfWaga);
        tylkoLiczby(tfWzrost);
        tylkoLiczby(tfWiek);

        ToggleGroup plecGroup = new ToggleGroup();
        RadioButton rbK = new RadioButton("K");
        RadioButton rbM = new RadioButton("M");
        rbK.setToggleGroup(plecGroup);
        rbM.setToggleGroup(plecGroup);
        rbK.setSelected(true);

        ComboBox<Aktywnosc> cbAktywnosc = new ComboBox<>();
        cbAktywnosc.getItems().addAll(Aktywnosc.values());
        cbAktywnosc.setValue(Aktywnosc.SIEDZACY);

        Button btnBMI = new Button("BMI");
        Button btnPPM = new Button("PPM");
        Button btnCPM = new Button("CPM");

        btnBMI.setPrefWidth(100);
        btnPPM.setPrefWidth(100);
        btnCPM.setPrefWidth(100);

        GridPane grid = new GridPane();
        grid.setHgap(10);
        grid.setVgap(10);

        grid.add(new Label("Waga:"), 0, 0);
        grid.add(tfWaga, 1, 0);

        grid.add(new Label("Wzrost:"), 0, 1);
        grid.add(tfWzrost, 1, 1);

        grid.add(new Label("Wiek:"), 0, 2);
        grid.add(tfWiek, 1, 2);

        VBox prawa = new VBox(10,
                new Label("Płeć:"),
                new HBox(10, rbK, rbM),
                new Label("Aktywność:"),
                cbAktywnosc
        );

        HBox gora = new HBox(40, grid, prawa);

        HBox buttons = new HBox(15, btnBMI, btnPPM, btnCPM);
        buttons.setAlignment(Pos.CENTER);

        Region spacer = new Region();
        VBox.setVgrow(spacer, Priority.ALWAYS);

        VBox root = new VBox(20,
                gora,
                spacer,
                buttons
        );

        root.setPadding(new Insets(20));

        btnBMI.setOnAction(e -> {
            try {
                double waga = parseDouble(tfWaga.getText());
                double wzrost = parseDouble(tfWzrost.getText());
                int wiek = parseInt(tfWiek.getText());

                double bmi = waga / Math.pow(wzrost / 100.0, 2);
                String kat = kategoriaBMI(bmi);

                pokazInfo("BMI",
                        String.format(Locale.US,
                                "Twoje BMI wynosi: %.1f\n\nKategoria: %s",
                                bmi, kat));
            } catch (Exception ex) {
                pokazBlad();
            }
        });

        btnPPM.setOnAction(e -> {
            try {
                double waga = parseDouble(tfWaga.getText());
                double wzrost = parseDouble(tfWzrost.getText());
                int wiek = parseInt(tfWiek.getText());

                Plec plec = rbM.isSelected() ? Plec.M : Plec.K;

                double ppm = (plec == Plec.M)
                        ? 10 * waga + 6.25 * wzrost - 5 * wiek + 5
                        : 10 * waga + 6.25 * wzrost - 5 * wiek - 161;

                pokazInfo("PPM",
                        "Twoje PPM wynosi:\n" + Math.round(ppm) + " kcal");
            } catch (Exception ex) {
                pokazBlad();
            }
        });

        btnCPM.setOnAction(e -> {
            try {
                double waga = parseDouble(tfWaga.getText());
                double wzrost = parseDouble(tfWzrost.getText());
                int wiek = parseInt(tfWiek.getText());

                Plec plec = rbM.isSelected() ? Plec.M : Plec.K;

                double ppm = (plec == Plec.M)
                        ? 10 * waga + 6.25 * wzrost - 5 * wiek + 5
                        : 10 * waga + 6.25 * wzrost - 5 * wiek - 161;

                double cpm = ppm * cbAktywnosc.getValue().wsp;

                pokazInfo("CPM",
                        "Twoje CPM wynosi:\n" + Math.round(cpm) + " kcal");
            } catch (Exception ex) {
                pokazBlad();
            }
        });

        stage.setTitle("BMI+PPM+CPM+GUI");
        stage.setScene(new Scene(root, 520, 300));
        stage.show();
    }

    private void tylkoLiczby(TextField field) {
        field.textProperty().addListener((obs, old, now) -> {
            if (!now.matches("\\d*(\\.\\d*)?")) {
                field.setText(old);
            }
        });
    }

    private double parseDouble(String text) {
        if (text == null || text.isEmpty())
            throw new IllegalArgumentException();

        double v = Double.parseDouble(text);
        if (v <= 0)
            throw new IllegalArgumentException();

        return v;
    }

    private int parseInt(String text) {
        if (text == null || text.isEmpty())
            throw new IllegalArgumentException();

        int v = Integer.parseInt(text);
        if (v <= 0)
            throw new IllegalArgumentException();

        return v;
    }

    private String kategoriaBMI(double bmi) {
        if (bmi < 18.5) return "niedowaga";
        if (bmi < 25) return "waga prawidłowa";
        if (bmi < 30) return "nadwaga";
        return "otyłość";
    }

    private void pokazBlad() {
        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle("Błąd danych");
        alert.setHeaderText("Dane są nieprawidłowe");
        alert.setContentText("Proszę wpisać ponownie poprawne wartości.");
        alert.showAndWait();
    }

    private void pokazInfo(String tytul, String tresc) {
        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle(tytul);
        alert.setHeaderText(null);
        alert.setContentText(tresc);
        alert.showAndWait();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Editor is loading...
Leave a Comment