微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何创建然后将输入从第一个面板分配到一个 JFrame 中的不同面板?公式中的错误是什么?

如何解决如何创建然后将输入从第一个面板分配到一个 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。这是一种方法。

Compound Interest GUI

如您所见,我使用计算 JButton 分隔了输入字段和输出结果。到期金额在不可编辑的 JTextField 中。

为了创建 JPanel,我使用了 Swing GridBagLayoutGridBagLayout 用于创建类似表单的 JPanel,左侧为 JLabels,右侧为 JTextFields。我将 JTextField 值右对齐以获得更好的视觉外观。

一次一小块地构建您的应用程序。在运行第一个测试之前,不要尝试编写 200 行代码。你会弄得一团糟。

我做的第一件事是调用 SwingUtilities invokeLater 方法。此方法可确保在 Event Dispatch Thread 上创建和执行 Swing 组件。

我将 JFrameJPanel 的创建分开。 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;
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。