首页 > 解决方案 > 如何创建然后将输入从第一个面板分配到一个 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);
                      
                    }
                }
            }

标签: javaswingjframejbutton

解决方案


您可以为您的 GUI 创建一个JFrame和一个JPanel。这是一种方法。

复利图形用户界面

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

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

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

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

我将JFrameand的创建分开JPanelJFrame必须按特定顺序调用这些方法。这是我用于 Swing 应用程序的顺序。JPanelSwing 组件应按列、行顺序创建。这有助于您直观地验证组件是否已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;
            }
        }
    }
}

推荐阅读