I'm developing a system that calculates BMI. I'm making on NetBeans (I'm newbie in this IDE)
However i'm caught in a point... I'd like to print the values of a StringBuilder on a textArea with line break, but I can't do it.
The code (person class):
package Entities;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
public class person {
private String name;
private Double weight;
private Double height;
private Double BMI;
private String diagnosisDate;
private String result;
private Integer gender;
public person() {
}
public person(Integer gender) {
this.gender = gender;
}
public person(String name, Double weight, Double height, String diagnosisDate, Integer gender) {
this.name = name;
this.weight = weight;
this.height = height;
this.diagnosisDate = diagnosisDate;
this.gender = gender;
}
public person(String name, Double weight, Double height, String diagnosisDate) {
this.name = name;
this.weight = weight;
this.height = height;
this.diagnosisDate = diagnosisDate;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
public Double getBMI() {
return BMI;
}
public void setBMI(Double BMI) {
this.BMI = BMI;
}
public String getDiagnosisDate() {
return diagnosisDate;
}
public void setDiagnosisDate(String diagnosisDate) {
this.diagnosisDate = diagnosisDate;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public void calculateBMI() {
this.BMI = (this.weight / (Math.pow(this.height, 2)));
}
public String diagnosisDate() {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
return dtf.format(LocalDateTime.now());
}
// BMI calculation - MALE
public String BMIMale() {
BMI = (weight / (Math.pow(height, 2)));
double weightDifference;
double getFatWeightQuantity;
double loseWeightQuantity;
StringBuilder sb = new StringBuilder();
// Underweight
if (BMI < 20.70) {
result = "UnderWeight";
weightDifference = (Math.pow(height, 2) * 18.50) - weight;
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to fatten " + weightDifference + " to have a weight appropriate to your height");
sb.append("");
sb.append("RESULT: " + this.result + ".");
}
// Ideal Weight
if (BMI >= 20.70 && BMI <= 26.40) {
result = "Ideal Weight";
weightDifference = (Math.pow(height, 2) * 18.50) - weight;
getFatWeightQuantity = (Math.pow(height, 2) * 24.99) - weight;
loseWeightQuantity = weight - (Math.pow(height, 2) * 18.50);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("Your weight is ideal for your height!");
sb.append("You can still gain " + getFatWeightQuantity + " or lose " + loseWeightQuantity
+ "kgs without leaving normality.");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Little Overweight
if (BMI >= 26.50 && BMI <= 27.80) {
result = " Little Overweight";
weightDifference = weight - (Math.pow(height, 2) * 24.99);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to lose " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Overweight
if (BMI >= 27.90 && BMI <= 31.10) {
result = "Overweight";
weightDifference = weight - (Math.pow(height, 2) * 24.99);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to lose " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Obesity
if (BMI >= 31.20) {
result = "Obesity";
weightDifference = weight - (Math.pow(height, 2) * 24.99);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to lose " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
return sb.toString();
}
// BMI calculation - FEMALE
public String BMIFemale() {
BMI = (weight / (Math.pow(height, 2)));
double weightDifference;
double getFatWeightQuantity;
double loseWeightQuantity;
StringBuilder sb = new StringBuilder();
// Underweight
if (BMI < 19.10) {
result = "Underweight";
weightDifference = (Math.pow(height, 2) * 18.50) - weight;
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to fatten " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Ideal Weight
if (BMI >= 19.10 && BMI <= 25.80) {
result = "Ideal Weight";
weightDifference = (Math.pow(height, 2) * 18.50) - weight;
getFatWeightQuantity = (Math.pow(height, 2) * 24.99) - weight;
loseWeightQuantity = weight - (Math.pow(height, 2) * 18.50);
sb.append("BMI Calculator" + "\n");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("Your weight is ideal for your height!");
sb.append("You can still gain " + getFatWeightQuantity + " or lose " + loseWeightQuantity
+ "kgs without leaving normality.");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Little Overweight
if (BMI >= 25.90 && BMI <= 27.30) {
result = "Overweight";
weightDifference = weight - (Math.pow(height, 2) * 24.99);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to lose " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Overweight
if (BMI >= 27.40 && BMI <= 32.30) {
result = "Overweight";
weightDifference = weight - (Math.pow(height, 2) * 24.99);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to lose " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
// Obesity
if (BMI >= 32.40) {
result = "Obesity";
weightDifference = weight - (Math.pow(height, 2) * 24.99);
sb.append("BMI Calculator");
sb.append("Date of diagnosis: " + diagnosisDate());
sb.append("Name: " + name);
sb.append("Weight: " + weight);
sb.append("Height: " + height);
sb.append("BMI: " + BMI);
sb.append("You need to lose " + weightDifference + " kgs to stay within normal range!");
sb.append("");
sb.append("RESULT: " + result + ".");
}
return sb.toString();
}
}
And the main class (ui):
private void buttonCalculateActionPerformed(java.awt.event.ActionEvent evt) {
if (gender == 0) {
JOptionPane.showMessageDialog(null, "Choose an option (Male or Female)!");
} else {
String name = textFieldName.getText();
double weight = Double.parseDouble(textFieldWeight.getText());
double height = Double.parseDouble(textFieldHeight.getText());
String diagnosisDate = p.diagnosisDate();
person p = new person(name, weight, height, diagnosisDate, gender);
if (p.getGender() == -1) {
textAreaResult.append(p.BMIMale());
} else if (p.getGender() == 1) {
textAreaResult.append(p.BMIFemale());
}
}
}
(I'm showing only the part where I do the printing).
I can't do the code print each line of my StringBuilder, one under the other.
The result is this: Result
Do you see that the lines are printed glued to each other? How can I solve it? Print each line separately, one under the other?
Ps.: If it's missing info, you may ask to me more (i'm relatively new here...)
Make use of StringJoiner
StringJoiner joiner = new StringJoiner("\n");
// Underweight
if (BMI < 20.70) {
result = "UnderWeight";
weightDifference = (Math.pow(height, 2) * 18.50) - weight;
joiner.add("BMI Calculator");
joiner.add("Date of diagnosis: " + diagnosisDate());
joiner.add("Name: " + name);
joiner.add("Weight: " + weight);
joiner.add("Height: " + height);
joiner.add("BMI: " + BMI);
joiner.add("You need to fatten " + weightDifference + " to have a weight appropriate to your height");
joiner.add("");
joiner.add("RESULT: " + this.result + ".");
}
Seperate your concerns and decouple the Person
from the BMI
and the formatting, this makes the over solution MUCH more flexible, for example, you could have a long format, which includes all the line breaks and what not, a tabular format or a short "You're to fat" format 😉
Let's start by reducing the overlap of responsibilities
A person object deals with just the details relating to, well, the person 🤷♂️
public class Person {
enum Gender {
MALE, FEMALE
}
private String name;
private Double weight;
private Double height;
private Gender gender;
public Person() {
}
public Person(Gender gender) {
this.gender = gender;
}
public Person(String name, Double weight, Double height, Gender gender) {
this.name = name;
this.weight = weight;
this.height = height;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
}
Then you can isolate (and simplify) the calculations...
public class BMI {
enum Result {
UNDER_WEIGHT, IDEAL_WEIGHT, LITTLE_OVER_WEIGHT, OVER_WEIGHT, OBESE;
public String toString() {
switch (this) {
case UNDER_WEIGHT:
return "Under weight";
case IDEAL_WEIGHT:
return "Ideal";
case LITTLE_OVER_WEIGHT:
return "Little over weight";
case OVER_WEIGHT:
return "Over weight";
case OBESE:
return "Obese";
}
return "unknown";
}
}
private Person person;
private double value;
private Result result;
private LocalDateTime diagnosisDate;
double weightDifference;
Double fatWeightQuantity = null;
Double loseWeightQuantity = null;
public BMI(Person person) {
this.person = person;
diagnosisDate = LocalDateTime.now();
value = (person.getWeight() / (Math.pow(person.getHeight(), 2)));
switch (person.getGender()) {
case MALE:
if (value < 20.70) {
result = Result.UNDER_WEIGHT;
weightDifference = weightDifference(18.5);
} else if (value <= 26.40) {
result = Result.IDEAL_WEIGHT;
weightDifference = weightDifference(18.5);
fatWeightQuantity = fatWeightQuantity(24.9);
loseWeightQuantity = loseWeightQuantity(18.5);
} else if (value <= 27.80) {
result = Result.LITTLE_OVER_WEIGHT;
weightDifference = weightDifference(24.99);
} else if (value <= 31.10) {
weightDifference = weightDifference(24.99);
result = Result.OVER_WEIGHT;
} else {
result = Result.OBESE;
weightDifference = weightDifference(24.99);
}
case FEMALE:
if (value < 19.10) {
result = Result.UNDER_WEIGHT;
weightDifference = (Math.pow(person.getHeight(), 2) * 18.50) - person.getWeight();
} else if (value <= 25.80) {
result = Result.IDEAL_WEIGHT;
weightDifference = (Math.pow(person.getHeight(), 2) * 18.50) - person.getWeight();
fatWeightQuantity = fatWeightQuantity(24.9);
loseWeightQuantity = loseWeightQuantity(18.5);
} else if (value <= 27.30) {
result = Result.LITTLE_OVER_WEIGHT;
weightDifference = weightDifference(24.99);
} else if (value <= 32.30) {
weightDifference = weightDifference(24.99);
result = Result.OVER_WEIGHT;
} else {
result = Result.OBESE;
weightDifference = weightDifference(24.99);
}
break;
}
}
public double getValue() {
return value;
}
public Person getPerson() {
return person;
}
public Result getResult() {
return result;
}
public double getWeightDifference() {
return weightDifference;
}
public Double getFatWeightQuantity() {
return fatWeightQuantity;
}
public Double getLoseWeightQuantity() {
return loseWeightQuantity;
}
protected double heightByFactor(double factor) {
return Math.pow(getPerson().getHeight(), 2) * factor;
}
protected double weightDifference(double factor) {
return heightByFactor(factor) - getPerson().getWeight();
}
protected double fatWeightQuantity(double factor) {
return heightByFactor(factor) - getPerson().getWeight();
}
protected double loseWeightQuantity(double factor) {
return getPerson().getWeight() - heightByFactor(factor);
}
public LocalDateTime getDiagnosisDate() {
return diagnosisDate;
}
}
Now, I've only done long format here, but you can see where this can go and the flexibility it can provide.
public class BMIFormatter {
public static String longFormat(BMI bmi) {
StringJoiner joiner = new StringJoiner("\n");
joiner.add("BMI Calculator");
joiner.add("Date of diagnosis " + DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(bmi.getDiagnosisDate()));
joiner.add("Name: " + bmi.getPerson().getName());
joiner.add("Weight: " + bmi.getPerson().getWeight());
joiner.add("Height: " + bmi.getPerson().getHeight());
joiner.add("BMI: " + NumberFormat.getNumberInstance().format(bmi.getValue()));
switch (bmi.getResult()) {
case UNDER_WEIGHT:
joiner.add("You need to fatten " + NumberFormat.getNumberInstance().format(bmi.getWeightDifference()) + " kgs to stay within normal range!");
break;
case IDEAL_WEIGHT:
joiner.add("Your weight is ideal for your height!");
joiner.add("You can still gain " + NumberFormat.getNumberInstance().format(bmi.getFatWeightQuantity()) + " or lose " + NumberFormat.getNumberInstance().format(bmi.getLoseWeightQuantity()) + "kgs without leaving normality.");
break;
case LITTLE_OVER_WEIGHT:
joiner.add("You need to lose" + NumberFormat.getNumberInstance().format(bmi.getWeightDifference()) + " kgs to stay within normal range!");
break;
case OVER_WEIGHT:
joiner.add("You need to lose" + NumberFormat.getNumberInstance().format(bmi.getWeightDifference()) + " kgs to stay within normal range!");
break;
case OBESE:
joiner.add("You need to lose" + NumberFormat.getNumberInstance().format(bmi.getWeightDifference()) + " kgs to stay within normal range!");
break;
}
joiner.add("");
joiner.add("RESULT: " + bmi.result.toString() + ".");
return joiner.toString();
}
}
And then you could pull it all together using something like...
Person person = new Person("Bob", 65.5, 1.8, Person.Gender.MALE);
BMI bmi = new BMI(person);
System.out.println(BMIFormatter.longFormat(bmi));
Which prints
BMI Calculator
Date of diagnosis 2022-01-24T15:15:40.685079
Name: Bob
Weight: 65.5
Height: 1.8
BMI: 20.216
Your weight is ideal for your height!
You can still gain 15.176 or lose 5.56kgs without leaving normality.
nb: Check the calculations, I've tried hard to make sure they are correct, but I don't have the algorithm your using RESULT: Ideal.