Я не могу получить текст из пользовательского ввода в текстовом поле в области потока. Это кажется очень простым, и я попробовал предложения из других подобных постов, но они не помогают. Мне нужно получить доступ к вводу, чтобы привести его к двойному, чтобы я мог делать вычисления на нем. Моя кнопка настроена на захват пользовательских вводов при нажатии, и именно тогда я сталкиваюсь с сообщениями об ошибках:
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;
}
}