Как использовать объект для добавления данных в пустой табличный вид в JavaFX? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь создать надстройку, которая рассчитывает ежемесячный ипотечный платеж с учетом суммы кредита, процентной ставки и срока. Но у меня много проблем с добавлением данных в таблицу. Я создал класс с именем «Платеж» и в классе контроллера создал массив объектов «Платеж». Каждый Платежный объект будет представлять строку в табличном представлении. Затем я создал наблюдаемый массив списков, используя

ObservableList items = FX.Collections.observatbleArrayList (payment)

и добавил ObservableList в табличное представление, используя tableview.setItems ( items).

Но в каждом ряду отображаются только 2 значения из каждого Платежного объекта. А именно, в каждой строке отображаются только значения «месяц» и «оставшееся значение». Но оставшееся значение отображается под столбцом «оплата», поэтому оно отображается под неправильным столбцом. Ниже приведены коды для моего контроллера, а также мой класс оплаты:

import java.net.URL;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;


public class MortgagecalculatorController implements Initializable {

   @FXML
   private TextField loanAmount;
   @FXML
   private ComboBox<Double> interest;
   @FXML
   private ComboBox<Integer> mTerm;
   @FXML
   private Button calculateButton;
   @FXML
   private TextField totalPayment;
   @FXML
   private TableView<Payment> tView;

/**
    * Initializes the controller class.
    */
   @Override
   public void initialize(URL url, ResourceBundle rb) {
      // TODO
      for (double i = 3.25; i <= 5; i = i + 0.01) {
         double temp = ((double) Math.round(i * 100)) / 100;
         interest.getItems().add(temp);
      }
      mTerm.getItems().addAll(5, 10, 15, 30);

      TableColumn monthColumn = new TableColumn("Month Number");
      monthColumn.setPrefWidth(100);
      monthColumn.setCellValueFactory(new PropertyValueFactory<>("month"));

      TableColumn paymentColumn = new TableColumn("Payment");
      paymentColumn.setPrefWidth(140);
      paymentColumn.setCellValueFactory(new PropertyValueFactory<>("monthlyPayment"));

      TableColumn principleColumn = new TableColumn("Principle Paid");
      principleColumn.setPrefWidth(140);
      paymentColumn.setCellValueFactory(new PropertyValueFactory<>("principle"));

      TableColumn interestColumn = new TableColumn("Interest Paid");
      interestColumn.setPrefWidth(140);
      paymentColumn.setCellValueFactory(new PropertyValueFactory<>("interest"));

      TableColumn totalInterestColumn = new TableColumn("Total Interest Paid");
      totalInterestColumn.setPrefWidth(140);
      paymentColumn.setCellValueFactory(new PropertyValueFactory<>("total"));

      TableColumn remainingColumn = new TableColumn("Remaining Value");
      remainingColumn.setPrefWidth(140);
      paymentColumn.setCellValueFactory(new PropertyValueFactory<>("remaining"));

      tView.getColumns().addAll(monthColumn, paymentColumn, principleColumn, interestColumn, totalInterestColumn, remainingColumn);

      interest.setValue(3.25);
      mTerm.setValue(5);
   }

   @FXML
   private void handleCalculateButton(ActionEvent event) {
      double loan;
      if (loanAmount.getText().isEmpty()) {
         System.out.println("Please enter loan amount");
         return;
      }
      if (isNumeric(loanAmount.getText())) {
         loan = Double.parseDouble(loanAmount.getText());
      } else {
         System.out.println("loan amount entered is non-numeric");
         return;
      }
      int months = mTerm.getValue() * 12;
      double monthlyInterest = (interest.getValue() / 100) / 12;
      double monthlyPayment = loan * monthlyInterest / (1 - (Math.pow(1 / (1 + monthlyInterest), months)));
      Payment[] payments = new Payment[months];
      double rValue = loan;
      double totalInterest = 0;
      System.out.println("monthly payment: "+monthlyPayment);
      for (int i = 0; i < payments.length; i++) {
         double interestPaid = rValue * monthlyInterest;
         double principle = monthlyPayment - interestPaid;
         totalInterest = totalInterest + interestPaid;
         rValue = rValue - principle;
         payments[i] = new Payment(String.valueOf(i + 1), monthlyPayment, principle, interestPaid, totalInterest, rValue);
      }
      ObservableList<Payment> items = FXCollections.observableArrayList(payments);
      tView.setItems(items);
   }

   public static boolean isNumeric(String str) {
      try {
         Double.parseDouble(str);
         return true;
      } catch (NumberFormatException e) {
         return false;
      }
   }

}
public class Payment {
   private String month;
   private double monthlyPayment;
   private double principle;
   private double interest;
   private double total;
   private double remaining;

   public Payment(String mon, double pay,double principle, double interest,double totalInterest, double rValue ){
   this.month=mon;
   this.monthlyPayment=pay;
   this.principle=principle;
   this.interest=interest;
   this.total=totalInterest;
   this.remaining=rValue;
}

   public String getMonth(){
      return month;
   }
   public double getMonthlyPayment(){
      return monthlyPayment;
   }
   public double getPrinciple(){
      return principle;
   }
   public double getInterest(){
      return interest;
   }
   public double getTotal(){
      return total;
   }
   public double getRemaining(){
      return remaining;
   }


}

1 Ответ

0 голосов
/ 01 апреля 2020

Вы постоянно переопределяете CellValueFactory paymentColumn путем (наиболее вероятного копирования) этой строки:

paymentColumn.setCellValueFactory(new PropertyValueFactory<>("monthlyPayment"));

Вы изменяете значение, но не TableColumn.

Для каждого столбца TableColumn, начиная с PrincipleColumn, необходимо установить правильный CellValueFactory. Например, для PrincipleColumn вам нужно сделать следующее:

TableColumn principleColumn = new TableColumn("Principle Paid");
principleColumn.setPrefWidth(140);
principleColumn.setCellValueFactory(new PropertyValueFactory<>("principle"));

Обратите внимание на последнюю строку, вам нужно использовать incipColumn.setCellValueFactory (...) в этом случае.

...