问题描述
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JFrame{
public static void main (String [] args){
//Components to be displayed on First panel
JFrame frame = new JFrame("Insurance Calculation");
frame.setVisible(true);
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350,350);
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
frame.add(panel);
JLabel label1 = new JLabel ("Enter All required Input");
JLabel depositAmount = new JLabel("Enter Amount Deposited : ");
JLabel yearsMature = new JLabel("Enter Years to Mature : ");
JLabel insRate = new JLabel("Enter Interest Rate : ");
JTextField depositTF = new JTextField(10);
JTextField yearsTF = new JTextField(10);
JTextField rateTF = new JTextField(10);
JButton button = new JButton ("Calculate");
panel.add(label1);
panel.add(depositAmount);
panel.add(depositTF);
panel.add(yearsMature);
panel.add(yearsTF);
panel.add(insRate);
panel.add(rateTF);
panel.add(button);
button.addActionListener(new Action());
}
static class Action implements ActionListener{
public void actionPerformed(ActionEvent e){
//Shows result on another frame,but I actually want it to replace the content prevIoUsly
JFrame frame1 = new JFrame("Insurance Calculation");
frame1.setVisible(true);
frame1.setSize(400,400);
double depositAmount;
double yearsMature;
double insRate;
double total;
double a;
double b;
double c;
//Convert inputs from user to Double
depositAmount = Double.parseDouble(depositTF.getText());
yearsMature = Double.parseDouble(yearsTF.getText());
insRate = Double.parseDouble(rateTF.getText());
//Formula
a = 1 + insRate / 100;
b = Math.pow(a,yearsMature);
c = depositAmount * b;
//Convert Double back to String in JLabel
depositTF.setText(Double.toString(depositAmount));
yearsTF.setText(Double.toString(yearsMature));
rateTF.setText(Double.toString(insRate));
totalTF.setText(Double.toString(c));
//Components wanted to be displayed in second tab
JLabel label5 = new JLabel("Amount Deposited : " + depositAmount);
JLabel label6 = new JLabel("Years : " +yearsMature);
JLabel label7 = new JLabel("Interest Rate : " + insRate);
JLabel label8 = new JLabel("Total Amount After 15 years: " + c);
JButton button1 = new JButton ("Try Again");
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
frame1.add(panel);
//adding all components into the panel
panel.add(label5);
panel.add(label6);
panel.add(label7);
panel.add(label8);
panel.add(button1);
}
}
}
解决方法
您可以为您的 GUI 创建一个 JFrame
和一个 JPanel
。这是一种方法。
如您所见,我使用计算 JButton
分隔了输入字段和输出结果。到期金额在不可编辑的 JTextField
中。
为了创建 JPanel
,我使用了 Swing GridBagLayout。 GridBagLayout
用于创建类似表单的 JPanel
,左侧为 JLabels
,右侧为 JTextFields
。我将 JTextField
值右对齐以获得更好的视觉外观。
一次一小块地构建您的应用程序。在运行第一个测试之前,不要尝试编写 200 行代码。你会弄得一团糟。
我做的第一件事是调用 SwingUtilities
invokeLater
方法。此方法可确保在 Event Dispatch Thread 上创建和执行 Swing 组件。
我将 JFrame
和 JPanel
的创建分开。 JFrame
方法必须按特定顺序调用。这是我用于 Swing 应用程序的顺序。 JPanel
Swing 组件应按列、行顺序创建。这有助于您直观地验证组件是否已正确创建并添加到 JPanel
。
您的复利计算是正确的。我将其修改为按月复利,而不是按年复利。
这是完整的、可运行的代码。
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class CompoundInterestCalculator implements Runnable {
private JTextField depositTF;
private JTextField yearsTF;
private JTextField rateTF;
private JTextField totalTF;
public static void main(String[] args) {
SwingUtilities.invokeLater(new CompoundInterestCalculator());
}
@Override
public void run() {
// Components to be displayed on First panel
JFrame frame = new JFrame("Compound Interest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = createMainPanel();
frame.add(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5,5);
gbc.weightx = 1.0;
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy = 0;
JLabel label1 = new JLabel("Enter All Required Input");
label1.setFont(panel.getFont().deriveFont(Font.BOLD,18f));
panel.add(label1,gbc);
gbc.gridwidth = 1;
gbc.gridy++;
JLabel depositAmount = new JLabel("Enter Amount Deposited:");
panel.add(depositAmount,gbc);
gbc.gridx++;
depositTF = new JTextField(10);
depositTF.setHorizontalAlignment(JTextField.TRAILING);
panel.add(depositTF,gbc);
gbc.gridx = 0;
gbc.gridy++;
JLabel yearsMature = new JLabel("Enter Years to Mature:");
panel.add(yearsMature,gbc);
gbc.gridx++;
yearsTF = new JTextField(10);
yearsTF.setHorizontalAlignment(JTextField.TRAILING);
panel.add(yearsTF,gbc);
gbc.gridx = 0;
gbc.gridy++;
JLabel insRate = new JLabel("Enter Interest Rate:");
panel.add(insRate,gbc);
gbc.gridx++;
rateTF = new JTextField(10);
rateTF.setHorizontalAlignment(JTextField.TRAILING);
panel.add(rateTF,gbc);
gbc.gridwidth = 2;
gbc.gridx = 0;
gbc.gridy++;
JButton button = new JButton("Calculate");
panel.add(button,gbc);
button.addActionListener(new CalculationListener());
gbc.gridwidth = 1;
gbc.gridy++;
JLabel label = new JLabel("Total Amount at Maturity:");
panel.add(label,gbc);
gbc.gridx++;
totalTF = new JTextField(10);
totalTF.setEditable(false);
totalTF.setHorizontalAlignment(JTextField.TRAILING);
panel.add(totalTF,gbc);
return panel;
}
public class CalculationListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent event) {
double amount = valueOf(depositTF.getText().trim());
double years = valueOf(yearsTF.getText().trim());
double rate = valueOf(rateTF.getText().trim());
if (amount == Double.MIN_VALUE
|| years == Double.MIN_VALUE
|| rate == Double.MIN_VALUE) {
totalTF.setText("Error");
return;
}
// Compound interest (monthly)
double a = 1.0 + rate / 100.0 / 12.0;
double b = Math.pow(a,years * 12.0);
double c = amount * b;
String s = String.format("%,.2f",c);
totalTF.setText(s);
}
private double valueOf(String number) {
try {
return Double.valueOf(number);
} catch (NumberFormatException e) {
return Double.MIN_VALUE;
}
}
}
}