复利计算器3.0更新版

  1 import java.text.DecimalFormat;
  2 
  3 
  4 public class Calculate {
  5 //        形参为本金,利率,存入年限
  6 //       F:复利终值
  7 //       P:本金
  8 //       I:利率
  9 //       N:存入年限
 10 //        C: 年复利次数
 11     double principal;//本金
 12     double yearRate;//年利率
 13     int years;//存入年限
 14     int bonusTime;//年复利次数
 15     double compoundInterest;//复利终值
 16     double simpleInterest;
 17     double i;
 18     DecimalFormat df = new DecimalFormat("#.0000");
 19     boolean error = false;
 20     
 21     public Calculate(String P, String I, String N, String C, String F) {
 22         if(P == null || P.length() <= 0){
 23             principal = 0;
 24         }else {
 25             try {
 26                 principal = Double.parseDouble(P);
 27             } catch (Exception e) {
 28                 error = true;
 29             }
 30         }
 31         
 32         if(I == null || I.length() <= 0){
 33             yearRate = 0;
 34         }else {
 35             try {
 36                 yearRate = Double.parseDouble(I);
 37             } catch (Exception e) {
 38                 error = true;
 39             }            
 40         }
 41         
 42         if(N == null || N.length() <= 0){
 43             years = 0;
 44         }else {
 45             try {
 46                 years = Integer.parseInt(N);
 47             } catch (Exception e) {
 48                 error = true;
 49             }
 50         }
 51         
 52         if(C == null || C.length() <= 0){
 53             bonusTime = 0;
 54         }else {
 55             try {
 56                 bonusTime = Integer.parseInt(C);
 57             } catch (Exception e) {
 58                 error = true;
 59             }            
 60         }
 61         
 62         if(F == null || F.length() <= 0){
 63             compoundInterest = 0;
 64         }else {
 65             try {
 66                 compoundInterest = Double.parseDouble(F);
 67             } catch (Exception e) {
 68                 error = true;
 69             }
 70         }
 71         
 72         i = Math.pow(1.0 + yearRate / bonusTime, bonusTime) - 1;
 73     }
 74     
 75     
 76     //求复利终值
 77     public String calculateCompoundInterest(){            
 78         compoundInterest = principal * Math.pow((1 + i), years);
 79         return df.format(compoundInterest);
 80     }
 81     //求本金
 82     public String calculatePrincipal() {
 83         principal = compoundInterest / Math.pow((1 + i), years);
 84         return df.format(principal);
 85     }
 86     //求时间
 87     public String calculateYears() {
 88         if((Math.log(compoundInterest / principal) / Math.log(1 + i)) % 1 > 0){
 89             years = (int) (Math.log(compoundInterest / principal) / Math.log(1 + i)) + 1;
 90         }
 91         return String.valueOf(years);
 92     }
 93     //求单利
 94     public String calculateSimpleInterest() {
 95         simpleInterest = principal * yearRate * years + principal;
 96         return String.valueOf(simpleInterest);
 97     }
 98     //求利率
 99     public String calculateI(){
100         i = Math.pow((compoundInterest / principal), (1.0 / years)) - 1; 
101         return df.format(i);
102     }
103     //求投资回报
104     public String calculateInvestment() {
105         double investment;
106         investment = principal * (1 + yearRate) * (Math.pow((1 + yearRate), years) - 1) / yearRate;
107         return df.format(investment);
108     }
109     //求还款
110     public String calculateRepayment() {
111         double repayment;
112         //等额本息每月还款 = 本金*年利率/12*(1+年利率/12)^贷款月数/((1+年利率/12)^贷款月数-1)
113         repayment = principal * (yearRate / 12) * Math.pow((1 + (yearRate / 12)), (years * 12)) / (Math.pow((1 + (yearRate / 12)), (years * 12)) - 1);
114         return df.format(repayment);
115     }
116 }
  1 import java.awt.Font;
  2 import java.awt.event.ItemEvent;
  3 import java.awt.event.ItemListener;
  4 import java.awt.event.MouseAdapter;
  5 import java.awt.event.MouseEvent;
  6 
  7 import javax.swing.DefaultComboBoxModel;
  8 import javax.swing.JButton;
  9 import javax.swing.JComboBox;
 10 import javax.swing.JFrame;
 11 import javax.swing.JLabel;
 12 import javax.swing.JOptionPane;
 13 import javax.swing.JTextField;
 14 import javax.swing.SwingUtilities;
 15 import javax.swing.UIManager;
 16 
 17 import org.dyno.visual.swing.layouts.Constraints;
 18 import org.dyno.visual.swing.layouts.GroupLayout;
 19 import org.dyno.visual.swing.layouts.Leading;
 20 
 21 //VS4E -- DO NOT REMOVE THIS LINE!
 22 public class MainFrame extends JFrame {
 23 
 24     private static final long serialVersionUID = 1L;
 25     private JLabel jLabel0;
 26     private JLabel jLabel1;
 27     private JLabel jLabel2;
 28     private JLabel jLabel3;
 29     public MainFrame() {
 30         initComponents();
 31     }
 32 
 33     private void initComponents() {
 34         setLayout(new GroupLayout());
 35         add(getJLabel0(), new Constraints(new Leading(60, 10, 10), new Leading(70, 10, 10)));
 36         add(getJLabel1(), new Constraints(new Leading(60, 10, 10), new Leading(170, 10, 10)));
 37         add(getJLabel2(), new Constraints(new Leading(60, 10, 10), new Leading(270, 10, 10)));
 38         add(getJLabel3(), new Constraints(new Leading(60, 10, 10), new Leading(370, 10, 10)));
 39         add(getJLabel4(), new Constraints(new Leading(60, 10, 10), new Leading(470, 10, 10)));
 40         add(getJTextField0(), new Constraints(new Leading(290, 300, 10, 10), new Leading(70, 50, 10, 10)));
 41         add(getJTextField1(), new Constraints(new Leading(290, 300, 10, 10), new Leading(170, 50, 10, 10)));
 42         add(getJTextField2(), new Constraints(new Leading(290, 300, 10, 10), new Leading(270, 50, 10, 10)));
 43         add(getJTextField3(), new Constraints(new Leading(290, 300, 10, 10), new Leading(370, 50, 10, 10)));
 44         add(getJTextField4(), new Constraints(new Leading(290, 300, 10, 10), new Leading(470, 50, 10, 10)));
 45         add(getJComboBox0(), new Constraints(new Leading(622, 161, 10, 10), new Leading(107, 61, 10, 10)));
 46         add(getJButton0(), new Constraints(new Leading(643, 12, 12), new Leading(257, 10, 10)));
 47         setSize(808, 600);
 48     }
 49 
 50     private JComboBox getJComboBox0() {
 51         if (jComboBox0 == null) {
 52             jComboBox0 = new JComboBox();
 53             jComboBox0.setFont(new Font("宋体", Font.BOLD, 40));
 54             jComboBox0.setModel(new DefaultComboBoxModel(new Object[] { "求复利", "求本金", "求利率", "求时间", "求单利", "求回报", "求还款" }));
 55             jComboBox0.setDoubleBuffered(false);
 56             jComboBox0.setBorder(null);
 57             jComboBox0.addItemListener(new ItemListener() {
 58     
 59                 public void itemStateChanged(ItemEvent event) {
 60                     jComboBox0ItemItemStateChanged(event);
 61                 }
 62             });
 63         }
 64         return jComboBox0;
 65     }
 66 
 67     private JTextField getJTextField4() {
 68         if (jTextField4 == null) {
 69             jTextField4 = new JTextField();
 70             jTextField4.setFont(font);
 71             jTextField4.setEditable(false);
 72         }
 73         return jTextField4;
 74     }
 75 
 76     private JLabel getJLabel4() {
 77         if (jLabel4 == null) {
 78             jLabel4 = new JLabel();
 79             jLabel4.setFont(new Font("宋体", Font.BOLD, 40));
 80             jLabel4.setText("复利终值:");
 81         }
 82         return jLabel4;
 83     }
 84 
 85     private JButton getJButton0() {
 86         if (jButton0 == null) {
 87             jButton0 = new JButton();
 88             jButton0.setFont(new Font("宋体", Font.BOLD, 40));
 89             jButton0.setText("计算");
 90             jButton0.addMouseListener(new MouseAdapter() {
 91     
 92                 public void mouseClicked(MouseEvent event) {
 93                     jButton0MouseMouseClicked(event);
 94                 }
 95             });
 96         }
 97         return jButton0;
 98     }
 99 
100     private JTextField getJTextField3() {
101         if (jTextField3 == null) {
102             jTextField3 = new JTextField();
103             jTextField3.setFont(font);
104         }
105         return jTextField3;
106     }
107 
108     private JTextField getJTextField2() {
109         if (jTextField2 == null) {
110             jTextField2 = new JTextField();
111             jTextField2.setFont(font);
112         }
113         return jTextField2;
114     }
115 
116     private JTextField getJTextField1() {
117         if (jTextField1 == null) {
118             jTextField1 = new JTextField();
119             jTextField1.setFont(font);
120         }
121         return jTextField1;
122     }
123 
124     private JTextField getJTextField0() {
125         if (jTextField0 == null) {
126             jTextField0 = new JTextField();
127             jTextField0.setFont(font);
128         }
129         return jTextField0;
130     }
131 
132     Font font = new Font("宋体",Font.BOLD,40);
133     private JTextField jTextField0;
134     private JTextField jTextField1;
135     private JTextField jTextField2;
136     private JTextField jTextField3;
137     private JButton jButton0;
138     private JLabel jLabel4;
139     private JTextField jTextField4;
140     private JComboBox jComboBox0;
141     private static final String PREFERRED_LOOK_AND_FEEL = "javax.swing.plaf.metal.MetalLookAndFeel";
142     private JLabel getJLabel3() {
143         if (jLabel3 == null) {
144             jLabel3 = new JLabel();
145             jLabel3.setFont(font);
146             jLabel3.setText("年复利次数:");
147         }
148         return jLabel3;
149     }
150 
151     private JLabel getJLabel2() {
152         if (jLabel2 == null) {
153             jLabel2 = new JLabel();
154             jLabel2.setFont(font);
155             jLabel2.setText("存入年限:");
156         }
157         return jLabel2;
158     }
159 
160     private JLabel getJLabel1() {
161         if (jLabel1 == null) {
162             jLabel1 = new JLabel();
163             jLabel1.setFont(new Font("宋体", Font.BOLD, 40));
164             jLabel1.setText("年利率比:");
165         }
166         return jLabel1;
167     }
168 
169     private JLabel getJLabel0() {
170         if (jLabel0 == null) {
171             jLabel0 = new JLabel();
172             jLabel0.setFont(font);
173             jLabel0.setText("存入本金:");
174         }
175         return jLabel0;
176     }
177 
178     private static void installLnF() {
179         try {
180             String lnfClassname = PREFERRED_LOOK_AND_FEEL;
181             if (lnfClassname == null)
182                 lnfClassname = UIManager.getCrossPlatformLookAndFeelClassName();
183             UIManager.setLookAndFeel(lnfClassname);
184         } catch (Exception e) {
185             System.err.println("Cannot install " + PREFERRED_LOOK_AND_FEEL + " on this platform:" + e.getMessage());
186         }
187     }
188 
189     /**
190     * Main entry of the class.
191     * Note: This class is only created so that you can easily preview the result at runtime.
192     * It is not expected to be managed by the designer.
193     * You can modify it as you like.
194     */
195     public static void main(String[] args) {
196         installLnF();
197         SwingUtilities.invokeLater(new Runnable() {
198             public void run() {
199                 MainFrame frame = new MainFrame();
200                 frame.setDefaultCloseOperation(MainFrame.EXIT_ON_CLOSE);
201                 frame.setTitle("复利计算器 V3.0");
202                 frame.getContentPane().setPreferredSize(frame.getSize());
203                 frame.pack();
204                 frame.setLocationRelativeTo(null);
205                 frame.setVisible(true);
206             }
207         });
208         
209 
210     }
211 
212     private void jButton0MouseMouseClicked(MouseEvent event) {
213         
214 //        if (jTextField0.getText() == null || jTextField0.getText().length() <= 0) {
215 //            JOptionPane.showMessageDialog( null,"请输入存入本金");
216 //        }else if (jTextField1.getText() == null || jTextField1.getText().length() <= 0){
217 //            JOptionPane.showMessageDialog( null,"请输入利率比");
218 //        }else if (jTextField2.getText() == null || jTextField2.getText().length() <= 0) {
219 //            JOptionPane.showMessageDialog( null,"请输入存入年限");
220 //        }else if (jTextField3.getText() == null || jTextField3.getText().length() <= 0) {
221 //            JOptionPane.showMessageDialog( null,"请输入年复利次数");
222 //        }
223         
224             
225         Calculate calculate = new Calculate(jTextField0.getText(), jTextField1.getText(), jTextField2.getText(), jTextField3.getText(), jTextField4.getText());
226         if (calculate.error) {
227             JOptionPane.showMessageDialog(null, "输入有误,请重新输入", "错误", JOptionPane.ERROR_MESSAGE);
228             clear();
229         }
230         if(jComboBox0.getSelectedItem() == "求本金"){
231             jTextField0.setText(calculate.calculatePrincipal());
232         }else if (jComboBox0.getSelectedItem() == "求复利") {
233             jTextField4.setText(calculate.calculateCompoundInterest());        
234         }else if (jComboBox0.getSelectedItem() == "求时间") {
235             jTextField2.setText(calculate.calculateYears());
236         }else if(jComboBox0.getSelectedItem() == "求单利"){
237             jTextField4.setText(calculate.calculateSimpleInterest());
238         }else if(jComboBox0.getSelectedItem() == "求利率"){
239             jTextField1.setText(calculate.calculateI());
240         }else if(jComboBox0.getSelectedItem() == "求回报"){
241             jTextField4.setText(calculate.calculateInvestment());
242         }else if(jComboBox0.getSelectedItem() == "求还款"){
243             jTextField4.setText(calculate.calculateRepayment());
244         }
245         
246        
247     }
248     public void clear() {
249         jTextField0.setText(null);
250         jTextField1.setText(null);
251         jTextField2.setText(null);
252         jTextField3.setText(null);
253         jTextField4.setText(null);
254     }
255     
256     public void initTextField(boolean a, boolean b, boolean c, boolean d, boolean e){
257         jTextField0.setEditable(a);
258         jTextField1.setEditable(b);
259         jTextField2.setEditable(c); 
260         jTextField3.setEditable(d);
261         jTextField4.setEditable(e);
262     }
263 
264     public void initJLabel() {
265         jLabel0.setText("存入本金:");
266         jLabel1.setText("年利率比:");
267         jLabel2.setText("存入年限:");
268         jLabel3.setText("年复利次数:");
269         jLabel4.setText("复利终值:");
270     }
271     private void jComboBox0ItemItemStateChanged(ItemEvent event) {
272         if(event.getStateChange() == ItemEvent.SELECTED){
273             clear();
274             if (event.getItem() == "求本金") {
275                 initTextField(false, true, true, true, true);
276                 initJLabel();
277             }else if (event.getItem() == "求复利") {
278                 initTextField(true, true, true, true, false);
279                 initJLabel();
280             }else if (event.getItem() == "求时间") {
281                 initTextField(true, true, false, true, true);
282                 initJLabel();
283             }else if (event.getItem() == "求单利") {
284                 initTextField(true, true, true, false, false);
285                 initJLabel();
286                 jLabel4.setText("单利本息:");
287             }else if (event.getItem() == "求利率") {
288                 initTextField(true, false, true, true, true);
289                 initJLabel();
290             }else if (event.getItem() == "求回报") {
291                 initTextField(true, true, true, false, false);
292                 initJLabel();
293                 jLabel2.setText("投资期数:");
294                 jLabel4.setText("投资回报值:");    
295             }else if (event.getItem() == "求还款") {
296                 initTextField(true, true, true, false, false);
297                 initJLabel();
298                 jLabel0.setText("贷款金额:");
299                 jLabel2.setText("还款年限:");
300                 jLabel4.setText("月等额还款:");
301             }
302         }
303     }
304 
305     
306 
307 }

完成客户要求的对非法输入的判断和处理

添加功能贷款等额本息还款

对界面模块重构更为简洁易于后期更新

原文地址:https://www.cnblogs.com/xiseven/p/5297516.html