java - 如何创建然后将输入从第一个面板分配到一个 JFrame 中的不同面板?公式中的错误是什么?
问题描述
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
。这是一种方法。
如您所见,我用 Calculate 分隔了输入字段和输出结果JButton
。到期金额是不可编辑的JTextField
。
为了创建JPanel
,我使用了 Swing GridBagLayout。GridBagLayout
用于创建类似表单的,JPanel
在JLabels
左侧和JTextFields
右侧。我右对齐了这些JTextField
值以获得更好的视觉外观。
一次构建一个很小的应用程序。在运行第一个测试之前,不要尝试编写 200 行代码。你会一团糟。
我做的第一件事是调用该SwingUtilities
invokeLater
方法。此方法确保在Event Dispatch Thread上创建和执行 Swing 组件。
我将JFrame
and的创建分开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, 5));
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5, 5, 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;
}
}
}
}
推荐阅读
- java - 从 Thymeleaf 访问 Spring 中的属性文件
- c# - 将int转换为int?可能的更新?
- vb.net - 将列表中的所有值加一
- javascript - 在类扩展组件中, const state = [] 可以工作。我如何在函数 app() 组件中做类似的事情?
- python - 无需用户按回车即可获取用户的当前输入
- pandas - 如何读取熊猫文件夹中的所有csv文件?
- django - 为什么 user.has_perm 返回 false 虽然 request.user.get_all_permissions() 和 request.user.get_user_permissions() 返回权限?
- flutter - 增量计数器在颤振中返回'null'
- python - 在不加载到内存的情况下在 dask 中映射和合并
- java - Spring Boot Maven 依赖项导致错误