Невозможно получить ввод текста в текстовом поле для анализа, чтобы удвоить - PullRequest
0 голосов
/ 05 июля 2018

Я не могу получить текст из пользовательского ввода в текстовом поле в области потока. Это кажется очень простым, и я попробовал предложения из других подобных постов, но они не помогают. Мне нужно получить доступ к вводу, чтобы привести его к двойному, чтобы я мог делать вычисления на нем. Моя кнопка настроена на захват пользовательских вводов при нажатии, и именно тогда я сталкиваюсь с сообщениями об ошибках:

Exception in thread "JavaFX Application Thread" 
    java.lang.NumberFormatException: empty String

Любые другие предложения приветствуются; Я новый программист. Вначале проблема возникает в методе getLoanAmount, но также возникает и в других методах, которым необходимо получить текст в других текстовых полях, которые я использую.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;

//this class sets up the GUI and casts the data collected to variables for usage elsewhere
public class loanWithFeatures extends Application {

    //define my constants
    final int MONTHS_IN_YEAR = 12;

    TextField loanAmountTF = new TextField(); 
    TextField termTF = new TextField(); 
    TextField interestRateTF = new TextField();

    //main method 
    public static void main(String[] args) { 
        Application.launch(args);

    } 

    @Override
    public void start(Stage primaryStage) {

        //define my button
        Button btGo = new Button("Calculate Total Interest Cost");
        btGo.setOnAction(new Calculate()); 

        //make my flowpane 
        FlowPane flow = new FlowPane(); 

        flow.setPadding(new Insets(11, 12, 13, 14));  
        flow.setHgap(5); 
        flow.setVgap(5); 

        //for some reason this has to be in this method. It didn't work above 
        loanAmountTF.setPrefWidth(800);  
        termTF.setPrefWidth(800); 
        interestRateTF.setPrefWidth(800); 

        flow.getChildren().addAll(new Label("Loan Amount:"), loanAmountTF); 
        termTF.setPrefColumnCount(2); 
        flow.getChildren().addAll(new Label("Term"), termTF);
        interestRateTF.setPrefColumnCount(2); 
        flow.getChildren().addAll(new Label("Rate"), interestRateTF); 

        flow.getChildren().addAll(btGo); 

        //make the scene, put scene in flowpane 
        Scene scene = new Scene(flow); 

        //stage title 
        primaryStage.setTitle("Total Interest Cost"); 

        //add scene to the stage 
        primaryStage.setScene(scene); 

        //show the stage 
        primaryStage.show(); 
    }

    class Calculate implements EventHandler<ActionEvent> { 
        @Override 
        public void handle(ActionEvent e) { 

            //define my variables 
            double loanAmount = 0, term = 0, rate = 0, monthlyPayment = 0, monthlyInterest = 0, monthlyPrincipal =0, totalRepaid = 0, totalInterest =0, totalInterestPercentage =0; 
            double periodicInterestRate = 0, remainingPrincipal =0; 

            loanWithFeatures newLoan = new loanWithFeatures(); 
            loanAmount = newLoan.getLoanAmount(); 
            term = newLoan.getTerm(term); 
            rate = newLoan.getRate(rate); 
            periodicInterestRate = newLoan.periodicInterestRate(rate); 
            monthlyPayment = newLoan.monthlyPayment(loanAmount, periodicInterestRate, term); 
            remainingPrincipal = newLoan.remainingPrincipal(loanAmount, monthlyPayment, monthlyInterest); 
            monthlyInterest = newLoan.monthlyInterest(monthlyPayment, remainingPrincipal, periodicInterestRate); 
            monthlyPrincipal = newLoan.monthlyPrincipal(monthlyPayment, monthlyInterest); 
            totalRepaid = newLoan.totalRepaid(monthlyPayment, term); 
            totalInterest = newLoan.totalInterest(totalRepaid, loanAmount);
            totalInterestPercentage = newLoan.totalInterestPercentage(loanAmount, totalInterest); 
        }
    }

    //method to get loan amount 
    public double getLoanAmount() { 

        double loanAmountDouble = Double.parseDouble(loanAmountTF.getText()); 

        return loanAmountDouble; 
    }

    //method to get term 
    public int getTerm(double term) { 
        //define a string var, assign the value from textfield to that, cast to int, return int
        String termInput;  

        termInput = termTF.getText(); 

        int termIntYear = Integer.parseInt(termInput); 
        int termIntMonths = termIntYear * MONTHS_IN_YEAR; 

        return termIntMonths;  
    }

    //method to get rate
    public double getRate(double rate) { 
        String rateInput; 

        rateInput = interestRateTF.getText(); 

        double rateDouble = Integer.parseInt(rateInput); 

        return rateDouble; 
    }

    //method to define balloon payment, when it occurs


    //come back to this, I want it to be a checkbox, I don't know how to do that yet


    //method, get interest only or no?
    /*public boolean getInterestOnly(boolean interestOnly) { 
        Boolean interestOnlyBool = false;  
        String interestOnlyString = "uninitialized"; 

        interestOnlyString = interestOnlyTF.getText(); 

        //this only works if they input true, not something like yes 
        //TODO redo this with a radio list or dropdown that shows only true or false as selections 
        interestOnlyBool = Boolean.parseBoolean(interestOnlyString); 

        return interestOnlyBool; 
    } */

    //method, type of amortization
    //TODO come do this later when I know other types of amortization, just make it do full amortization right now


    //method early repayment penalty?
    //TODO do this after I do the math of the prepayment penalty 


    //this method calculates the monthly payment
    public double monthlyPayment(double loanAmount, double periodicInterestRate, double term) { 
        double monthlyPaymentDenominator = (Math.pow(1 + periodicInterestRate, term) -1) / (periodicInterestRate * Math.pow(1 + periodicInterestRate, term));
        double monthlyPayment = loanAmount / monthlyPaymentDenominator; 

        return monthlyPayment; 
    } 

    public double remainingPrincipal(double loanAmount, double monthlyPayment, double monthlyInterest ) { 
        double remainingPrincipal = loanAmount - (monthlyPayment - monthlyInterest); 

        return remainingPrincipal; 
    }

    public double monthlyInterest(double monthlyPayment, double remainingPrincipal, double periodicIntRate) { 
        double monthlyInterest = remainingPrincipal * periodicIntRate;   

        return monthlyInterest; 
    }

    //this method calculates monthly principal payment 
    public double monthlyPrincipal(double monthlyPayment, double monthlyInterest) { 
        double monthlyPrincipal = monthlyPayment - monthlyInterest; 

        return monthlyPrincipal; 
    }

    public double periodicInterestRate(double rate) { 

        double periodicIntRate = rate / MONTHS_IN_YEAR; 

        return periodicIntRate;
    }

    public double totalRepaid(double monthlyPayment, double term) { 
        double totalRepaid = monthlyPayment * term; 

        return totalRepaid; 
    }

    //this method calculates the total interest paid on the loan
    public double totalInterest(double totalRepaid, double loanAmount) { 
        double totalInterest = totalRepaid - loanAmount; 

        return totalInterest; 
    } 

    //this method calculates total interest percentage
    public double totalInterestPercentage(double loanAmount, double totalInterest) { 
        double totalInterestPercentage = totalInterest/loanAmount; 

        return totalInterestPercentage; 
    } 

}

1 Ответ

0 голосов
/ 05 июля 2018

У вас есть базовая проблема с экземплярами и классами в Java. То, что вы делаете, вызывает новый экземпляр вашего класса loanWithFeatures. Этот экземпляр отличается от того, с которым ваше приложение запускалось в main (откуда вы пытаетесь получить текст вашего TextField).

loanWithFeatures newLoan = new loanWithFeatures(); 
loanAmount = newLoan.getLoanAmount(); 

Так что я предлагаю оставить экземплярный вызов и сделать это так:

class Calculate implements EventHandler<ActionEvent> {
    @Override
    public void handle(ActionEvent e) {

        //define my variables
        double loanAmount = 0, term = 0, rate = 0, monthlyPayment = 0, monthlyInterest = 0, monthlyPrincipal =0, totalRepaid = 0, totalInterest = 0, totalInterestPercentage = 0;
        double periodicInterestRate = 0, remainingPrincipal = 0;

        loanAmount = newLoan.getLoanAmount();
        term = getTerm(term);
        rate = getRate(rate);
        periodicInterestRate = periodicInterestRate(rate);
        monthlyPayment = monthlyPayment(loanAmount, periodicInterestRate, term);
        remainingPrincipal = remainingPrincipal(loanAmount, monthlyPayment, monthlyInterest);
        monthlyInterest = monthlyInterest(monthlyPayment, remainingPrincipal, periodicInterestRate);
        monthlyPrincipal = monthlyPrincipal(monthlyPayment, monthlyInterest);
        totalRepaid = totalRepaid(monthlyPayment, term);
        totalInterest = totalInterest(totalRepaid, loanAmount);
        totalInterestPercentage = totalInterestPercentage(loanAmount, totalInterest);
    }
}
...