在带有换行符的 TextArea 上打印 StringBuilder
Print a StringBuilder on a TextArea with line break
我正在开发一个计算 BMI 的系统。我在 NetBeans 上制作(我是这方面的新手 IDE)
但是我陷入了一个问题...
我想用换行符在 textArea 上打印 StringBuilder 的值,但我做不到。
代码(人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();
}
}
和主要 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());
}
}
}
(我只展示了打印的部分)。
我无法让代码打印我的 StringBuilder 的每一行,一个在另一个下面。
结果是这样的:
Result
你看到印刷的线条是粘在一起的吗?
我该如何解决?分别打印每一行,一行在另一行下面?
Ps.: 如果缺少信息,您可以向我询问更多信息(我在这里相对较新...)
在您的 append()
调用的每个字符串末尾放置一个换行符 \n
,如果不添加这些,则字符串是一个连续的行。
您需要在每行末尾添加一个换行符。像这样
sb.append("Name: " + name + "\n");
你可以...
利用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 + ".");
}
你可以...
分离您的关注点并将 Person
与 BMI
和格式分离,这使得过度解决方案更加灵活,例如,您可以使用长格式,其中包括所有换行符等等,表格格式或简短的“你太胖了”格式
让我们从减少职责重叠开始
人
一个人对象只处理与这个人有关的细节♂️
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;
}
}
BMI 计算...
然后您可以分离(并简化)计算...
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;
}
}
正在格式化
现在,我在这里只完成了长格式,但您可以看到它的用途以及它可以提供的灵活性。
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();
}
}
然后您可以使用诸如...
之类的方法将它们整合在一起
Person person = new Person("Bob", 65.5, 1.8, Person.Gender.MALE);
BMI bmi = new BMI(person);
System.out.println(BMIFormatter.longFormat(bmi));
打印
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: 检查计算,我已经努力确保它们是正确的,但我没有你使用的算法
结果:理想。
我正在开发一个计算 BMI 的系统。我在 NetBeans 上制作(我是这方面的新手 IDE)
但是我陷入了一个问题... 我想用换行符在 textArea 上打印 StringBuilder 的值,但我做不到。
代码(人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();
}
}
和主要 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());
}
}
}
(我只展示了打印的部分)。
我无法让代码打印我的 StringBuilder 的每一行,一个在另一个下面。
结果是这样的: Result
你看到印刷的线条是粘在一起的吗? 我该如何解决?分别打印每一行,一行在另一行下面?
Ps.: 如果缺少信息,您可以向我询问更多信息(我在这里相对较新...)
在您的 append()
调用的每个字符串末尾放置一个换行符 \n
,如果不添加这些,则字符串是一个连续的行。
您需要在每行末尾添加一个换行符。像这样
sb.append("Name: " + name + "\n");
你可以...
利用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 + ".");
}
你可以...
分离您的关注点并将 Person
与 BMI
和格式分离,这使得过度解决方案更加灵活,例如,您可以使用长格式,其中包括所有换行符等等,表格格式或简短的“你太胖了”格式
让我们从减少职责重叠开始
人
一个人对象只处理与这个人有关的细节♂️
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;
}
}
BMI 计算...
然后您可以分离(并简化)计算...
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;
}
}
正在格式化
现在,我在这里只完成了长格式,但您可以看到它的用途以及它可以提供的灵活性。
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();
}
}
然后您可以使用诸如...
之类的方法将它们整合在一起Person person = new Person("Bob", 65.5, 1.8, Person.Gender.MALE);
BMI bmi = new BMI(person);
System.out.println(BMIFormatter.longFormat(bmi));
打印
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: 检查计算,我已经努力确保它们是正确的,但我没有你使用的算法 结果:理想。