已有101人关注
Java从入门到精通 第1-14章学习后的实践练习
发表在Java图书答疑 2016-05-28
是否精华
版块置顶:
学完了1-14章,自己尝试编写了一个小程序做一个综合练习。对Swing设计、异常处理、内部类、数字处理、包装类、数组、字符串等做了一个综合运用。程序功能就是实现还款计算。请高手对我的源代码编写做一个指导,比如有哪些需要注意的问题,尽量从将来实战开发的方面提些意见。源代码我做了简单的注释,新手们也可以看看。以下是源代码:(也可以下载附件)

另外问一下IT业界老师:我是非计算机专业的专科毕业生,已毕业5年,是0基础开始学的,跟着视频以及课本纯自学,用的是晚上以及周末等业余时间,现在已经学一年零3个月了,我对编程很感兴趣。同时我就业的行业前景不好,我现在的学习进度有转行的希望吗?另外我英语基础也很差。希望有老师帮我分析一下。

package test;

//导入包
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.text.DecimalFormat;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;

//声明类并继承JFrame成为窗口类
public class PayCalculation extends JFrame{
//串行版本缺省值,不知这个是干嘛的,eclipse提示警告,就按照建议声明了
private static final long serialVersionUID = 1L;

//成员变量声明(偷个懒,其实这样是不符合规范的)
private JLabel l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19,l20;//标签
private JRadioButton rb1,rb2,rb3,rb4,rb5;//单选按钮
private JTextField tf1,tf2,tf3,tf4,tf5,tf6,tf7,tf8,tf9;//文本框
private JPanel p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13;//面板
private ButtonGroup bg1,bg2;//按钮组
private JButton b1,b2,b3;//提交按钮
private JTextArea ta;//文本域
private JScrollPane sp;//滚动面板
private JComboBox<String> cb;//下拉框

private String[] items={"20                        ","30","40","50","60","70","80","90",};//数组,用来初始化话下拉框

private FlowLayout fl=new FlowLayout(FlowLayout.CENTER, 20, 0);//流布局

private Font myFont1=new Font("仿宋",Font.BOLD,16);//字体
private Font myFont2=new Font("仿宋",Font.PLAIN,15);

//变量分别代表:贷款金额,房款总额,贷款月数, 月利率, 每月利息,总利息, 首付比例
private double amounts,sumAmounts,months=360.0,monthRate=3.25/1200.0,accrual,sumAccrual,scale;

//数字格式化
private DecimalFormat df=new DecimalFormat("#0.00");
private DecimalFormat df1=new DecimalFormat("000");

//构造函数
public PayCalculation() {
Container c=getContentPane();//从窗口获取容器
c.setLayout(new BorderLayout(0, 15));//设置容器布局

l1=new JLabel("贷款方式");//初始化,后面省略初始化注释
l1.setFont(myFont1);//设置字体
l1.setForeground(Color.RED);//设置字体颜色
rb1=new JRadioButton("公积金贷款");
rb1.setSelected(true);//设置默认选中
rb1.setFont(myFont2);
rb1.addActionListener(new ActionListener() {//添加动作事件监听,匿名内部类实现
public void actionPerformed(ActionEvent e) {//实现接口的方法
tf3.setText("3.25");
monthRate=3.25/1200.0;
}
});
rb2=new JRadioButton("商业贷款");
rb2.setFont(myFont2);
rb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tf3.setText("4.90");
monthRate=4.90/1200.0;
}
});
rb3=new JRadioButton("组合贷款");
rb3.setEnabled(false);//设置按钮不可用
rb3.setFont(myFont2);
rb3.setToolTipText("此功能尚未开启");//设置按钮提示信息
p1=new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));
bg1=new ButtonGroup();
bg1.add(rb1);bg1.add(rb2);bg1.add(rb3);//单选按钮添加到按钮组
p1.add(l1);p1.add(rb1);p1.add(rb2);p1.add(rb3);//单选按钮添加到面板
c.add(p1, BorderLayout.NORTH);//面板添加到容器

l2=new JLabel("贷款金额");
tf1=new JTextField(10);
tf1.addFocusListener(new FocusListener() {//添加焦点事件监听
public void focusLost(FocusEvent arg0) {//失去焦点
tf1.setToolTipText(null);
try{
int i=Integer.valueOf(tf1.getText());//数字包装类应用
amounts=i*10000.0;
if(i<1||i>100){
l4.setText("错误");
}else{
tf5.setText((int)amounts+"元");
l4.setText("正确");
}
}catch(NumberFormatException e){//捕获异常
l4.setText("错误");
}catch(Exception e){
JOptionPane.showMessageDialog(null, "发生未知错误");//弹出提示信息框
}
}
public void focusGained(FocusEvent arg0) {
tf1.setToolTipText("贷款金额范围1~100万");
}
});
l3=new JLabel("万");
l4=new JLabel("必填");
l4.setForeground(Color.RED);
l5=new JLabel("贷款年限");
tf2=new JTextField("30",10);
tf2.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent arg0) {
tf2.setToolTipText(null);
try{
int i=Integer.valueOf(tf2.getText());
months=i*12.0;
if(i<1||i>30){
l7.setText("错误");
}else{
tf9.setText((int)months+"月");
l7.setText("正确");
}
}catch(NumberFormatException e){
l7.setText("错误");
}catch(Exception e){
JOptionPane.showMessageDialog(null, "发生未知错误");
}
}
public void focusGained(FocusEvent arg0) {
tf2.setToolTipText("贷款年限范围1~30年");
}
});
l6=new JLabel("年");
l7=new JLabel("选填");
l7.setForeground(Color.RED);
l8=new JLabel("贷款利率");
tf3=new JTextField("3.25",10);
tf3.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent arg0) {
tf3.setToolTipText(null);
try{
double d=Double.valueOf(tf3.getText());
monthRate=d/1200.0;
if(d<=0.0||d>10.0){
l10.setText("错误");
}else{
l10.setText("正确");
}
}catch(NumberFormatException e){
l10.setText("错误");
}catch(Exception e){
JOptionPane.showMessageDialog(null, "发生未知错误");
}
}
public void focusGained(FocusEvent arg0) {
tf3.setToolTipText("贷款利率范围0.00~10.00%");
}
});
l9=new JLabel(" %");
l10=new JLabel("选填");
l10.setForeground(Color.RED);
l18=new JLabel("首付金额");
cb=new JComboBox<>(items);
cb.addFocusListener(new FocusListener() {
public void focusLost(FocusEvent e) {
l20.setText("正确");
}
public void focusGained(FocusEvent e) {
}
});
l19=new JLabel(" %");
l20=new JLabel("选填");
l20.setForeground(Color.RED);
l11=new JLabel("还款方式");
rb4=new JRadioButton("等额本金");
rb4.setSelected(true);
rb5=new JRadioButton("等额本息");
b1=new JButton("开始计算");
b1.addActionListener(new ActionListener() {//添加按钮监听
public void actionPerformed(ActionEvent arg0) {
sumAccrual=0.0;
try{
if(rb4.isSelected()){
tf8.setText(df.format(calc(amounts, months, monthRate, 1))+"元");
ta.setText("总共还款"+(int)months+"期:\n");
for(int i=1;i<=months;i++){
double b=calc(amounts, months, monthRate, i);
accrual=b-amounts/months;
sumAccrual+=accrual;
ta.append("第"+df1.format(i)+"期还款:"+df.format(b)+"元;本期归还本金:"+df.format(amounts/months)+//向文本域添加内容
"元;归还利息:"+df.format(accrual)+"元。\n");
}
}else if(rb5.isSelected()){
double b=calc(amounts, months, monthRate);
tf8.setText(df.format(b)+"元");
ta.setText("总共还款"+(int)months+"期:\n");
for(int i=1;i<=months;i++){
accrual=(amounts*monthRate-b)*Math.pow(1.0+monthRate,i-1.0)+b;
//sumAccrual+=accrual;//总利息第一种算法,把每月利息求和
ta.append("第"+df1.format(i)+"期还款:"+df.format(b)+"元;本期归还本金:"+df.format(b-accrual)+"元;归还利息:"+df.format(accrual)+"元。\n");
}
sumAccrual=b*months-amounts;//总利息第二种算法,还款总额-贷款总额
}
scale=Double.valueOf(String.valueOf(cb.getSelectedItem()).trim())/100.0;
sumAmounts=amounts/(1.0-scale)+sumAccrual;
tf4.setText(df.format(sumAmounts)+"元");
tf6.setText(df.format(amounts+sumAccrual)+"元");
tf7.setText(df.format(sumAccrual)+"元");
tf9.setText((int)months+"月");
}catch(Exception e){
tf4.setText(null);
tf6.setText(null);
tf7.setText(null);
tf8.setText(null);
tf9.setText(null);
ta.setText(null);
JOptionPane.showMessageDialog(PayCalculation.this, "输入有误,请重新填写");
}
}
});
b2=new JButton("重新填写");
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ta.setText(null);
tf1.setText(null);
tf2.setText("30");
rb1.doClick();//模拟单击按钮
rb4.doClick();
tf4.setText(null);
tf5.setText(null);
tf6.setText(null);
tf7.setText(null);
tf8.setText(null);
tf9.setText(null);
cb.setSelectedIndex(0);
amounts=0.0;
sumAmounts=0.0;
months=0.0;
monthRate=0.0;
accrual=0.0;
sumAccrual=0.0;
}
});
b3=new JButton("导出结果");
b3.setEnabled(false);
b3.setToolTipText("此功能尚未开启");
bg2=new ButtonGroup();
bg2.add(rb4);bg2.add(rb5);
p2=new JPanel(new GridLayout(0, 1));
p5=new JPanel(fl);
p6=new JPanel(fl);
p7=new JPanel(fl);
p8=new JPanel(fl);
p9=new JPanel(fl);
p13=new JPanel(fl);
p5.add(l2);p5.add(tf1);p5.add(l3);p5.add(l4);
p6.add(l5);p6.add(tf2);p6.add(l6);p6.add(l7);
p7.add(l8);p7.add(tf3);p7.add(l9);p7.add(l10);
p13.add(l18);p13.add(cb);p13.add(l19);p13.add(l20);
p8.add(l11);p8.add(rb4);p8.add(rb5);
p9.add(b1);p9.add(b2);p9.add(b3);
p2.add(p5);p2.add(p6);p2.add(p7);p2.add(p13);p2.add(p8);p2.add(p9);
c.add(p2, BorderLayout.CENTER);

//初始化和添加组件
l12=new JLabel("房款总额");
tf4=new JTextField(10);
l13=new JLabel("贷款总额");
tf5=new JTextField(10);
l14=new JLabel("还款总额");
tf6=new JTextField(10);
l15=new JLabel("利息总额");
tf7=new JTextField(10);
l16=new JLabel("首期还款");
tf8=new JTextField(10);
l17=new JLabel("贷款月数");
tf9=new JTextField(10);
p3=new JPanel(new GridLayout(0, 1, 0, 10));
p10=new JPanel(fl);
p11=new JPanel(fl);
p12=new JPanel(fl);
p10.add(l12);p10.add(tf4);p10.add(l13);p10.add(tf5);
p11.add(l14);p11.add(tf6);p11.add(l15);p11.add(tf7);
p12.add(l16);p12.add(tf8);p12.add(l17);p12.add(tf9);
p3.add(p10);p3.add(p11);p3.add(p12);
p4=new JPanel(new BorderLayout(0,10));
p4.add(p3,BorderLayout.CENTER);
ta=new JTextArea(12, 0);
ta.setLineWrap(true);//设置文本域自动换行
sp=new JScrollPane(ta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
p4.add(sp, BorderLayout.SOUTH);
c.add(p4, BorderLayout.SOUTH);

setTitle("贷款计算器");//设置标题
setSize(500, 600);//设置窗口大小
setLocationRelativeTo(null);//设置窗口位于屏幕正中
setResizable(false);//设置窗口不可最大化
setVisible(true);//设置窗口可见
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗口默认关闭操作
}

//等额本息算法
private double calc(double amounts,double months,double rate) throws ArithmeticException{
if(amounts==0.0||months==0.0||rate==0.0){
throw new ArithmeticException();//参数为0抛出异常
}
return amounts*rate*Math.pow(1+rate, months)/(Math.pow(1+rate, months)-1);//计算公式来自百度
}

//等额本金算法
private double calc(double amounts,double months,double rate,int mon) throws ArithmeticException{
if(amounts==0.0||months==0.0||rate==0.0){
throw new ArithmeticException();//参数为0抛出异常
}
return amounts*(1.0/months+(1.0-(mon-1.0)/months)*rate);//计算公式来自百度
}

//主函数,实例本类对象
public static void main(String[] args){
new PayCalculation();
}
}
分享到:
精彩评论 3
静心_mrkj
学分:0 LV1
2016-05-30
沙发
您好!编码过程中,变量名要写清楚,尽量不要用b2、p2这种类型,例如“导出结果”按钮,变量名b3可替换为btnResult;如果编程过程中,有重复代码,且这部分代码的功能相同,可以把这部分代码写到外部方法里,当程序需要执行这部分代码时,可直接调用这个方法。转行可以,但是java仅仅是基础(基础好了,拔高也就水到渠成),java web才是制作项目时主要应用的工具,所以我建议如果资金充裕,可以去软件培训的地方,专门培训一下java web的知识,注意java web不是单独的科目,它里面包含HTML、CSS、JavaScript等视图层知识,还包含深一层的SSH框架,还有就是熟练操作数据库等。英语不好没事儿,只要编程逻辑没问题,变量名百度就好,但是,关键词需要记清。
西瓜_mrkj
学分:0 LV1
2016-05-30
板凳
[FIELDSET][LEGEND]引自:1楼[/LEGEND]
您好!编码过程中,变量名要写清楚,尽量不要用b2、p2这种类型,例如“导出结果”按钮,变量名b3可替换为btnResult;如果编程过程中,有重复代码,且这部分代码的功能相同,可以把这部分代码写到外部方法里,当程序需要执行这部分代码时,可直接调用这个方法。转行可以,但是java仅仅是基础(基础好了,拔高也就水到渠成),java web才是制作项目时主要应用的工具,所以我建议如果资金充裕,可以去软件培训的地方,专门培训一下java web的知识,注意java web不是单独的科目,它里面包含HTML、CSS、JavaScript等视图层知识,还包含深一层的SSH框架,还有就是熟练操作数据库等。英语不好没事儿,只要编程逻辑没问题,变量名百度就好,但是,关键词需要记清。
[/FIELDSET]

回复:谢谢老师指导
  
静心_mrkj
学分:0 LV1
2016-05-31
地板
客气!
首页上一页 1 下一页尾页 3 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照