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 }
完成客户要求的对非法输入的判断和处理
添加功能贷款等额本息还款
对界面模块重构更为简洁易于后期更新
