Search code examples
javaswingnewlinestringbuilderjtextarea

Print a StringBuilder on a TextArea with line break


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...)


Solution

  • You could...

    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 + ".");
    
        }
    

    You could...

    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

    Person

    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;
        }
    }
    

    BMI calculations...

    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;
        }
    
    }
    

    Formatting

    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.