如何创建然后将输入从第一个面板分配到一个 JFrame 中的不同面板?公式中有什么错误?
How to create then assign inputs from first panel to different panel in one JFrame? And what's the mistakes in the formula?
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
方法。此方法确保 Swing 组件在 Event Dispatch Thread.
上创建和执行
我分开创建了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, 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;
}
}
}
}
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
方法。此方法确保 Swing 组件在 Event Dispatch Thread.
我分开创建了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, 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;
}
}
}
}