在带有换行符的 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 + ".");

    }

你可以...

分离您的关注点并将 PersonBMI 和格式分离,这使得过度解决方案更加灵活,例如,您可以使用长格式,其中包括所有换行符等等,表格格式或简短的“你太胖了”格式

让我们从减少职责重叠开始

一个人对象只处理与这个人有关的细节‍♂️

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: 检查计算,我已经努力确保它们是正确的,但我没有你使用的算法 结果:理想。