以下报告为本人(闽师18软2班2号)Java课程设计功能详解,如有大面积借鉴或转载,烦请注明来源
视图模块
一、登陆
主要使用方法:
1、禁用frame装饰
即让Frame窗口失去边框和标题栏的修饰
JFrame f1 = new JFrame("家庭理财系统");
f1.setLayout(null); //绝对布局
f1.setBounds(300, 200, 800, 600);
f1.setResizable(false);
f1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f1.setUndecorated(true); //禁用frame装饰
f1.setVisible(true);
注意事项:
a、setUndecorated方法必须在setVisible之前被执行
b、确保Frame窗口是新建且没有做过任何显示,否则将抛出异常
2、设置背景为图片
URL resource = this.getClass().getResource("image/5.jpg");
ImageIcon icon = new ImageIcon(resource);
backgrounnd1.setIcon(icon);
backgrounnd1.setBounds(0, 0, icon.getIconWidth(), icon.getIconHeight());
f1.getContentPane().add(backgrounnd1); //f1为上述代码的JFrame
f1.setVisible(true); //前段代码需放在setVisible方式之前执行
二、主界面
整个界面的透明实现较为复杂,所以在Java专栏下另开一篇文章,戳这里查看swing界面透明
1、添加数据
主要使用方法,前文有写过的不再赘述,下文同理
1)金额数据限制
private boolean isNum(String str) { //判断是否为数字
try {
double num = Double.valueOf(str);
} catch (Exception e) {
return false;
}
return true;
}
Double.valueOf(txt1.getText()).intValue() < 0.01 //判断是否大于0.01
2)日期正则
txt3.getText().matches("(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)")
3)二级联动下拉菜单
//下拉菜单1
public static JComboBox iEBox= new JComboBox(new Object[] {"支出","收入"});```
//下拉菜单2
static String[][] type={
{"餐饮","购物","学习","娱乐","医疗","其他"},
{"工资","奖金","生意","其他"}};
public static JComboBox typesBox=new JComboBox(type[0]);
//注册监听器
iEBox.addActionListener(this);
//事件处理实现二级联动
public void addBoxEventHandler(){
iEBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
int index=iEBox.getSelectedIndex();
typesBox.removeAllItems();
for (int i = 0; i < type[index].length; i++) {
typesBox.addItem(type[index][i]);
}
}
});
}
2、修改数据
具体数据处理与添加数据类似
3、删除数据
直接采用JOptionPane传入待删除行编号
4、财务统计
5、修改密码
需输入密码,直接采用JOptionPane完成
6、操作提示
7、数据格式化
需输入密码,直接采用JOptionPane完成
实体类
从需求分析开始就要设计好数据结构(这点很重要)
IS(接口):财务数据接口
IEStatement:财务数据实体类(继承IS)
Password:密码数据实体类
控制层
财务数据操控部分用到了接口传参,整体比较简单,没啥可讲的,贴一段财务数据操控的代码
public class IEStatementController {
public void addData(IS ies) {
new IEStatementModel().addData(ies);
}
public void deleteData(int i) {
new IEStatementModel().deleteData(i);
}
public void updateData(IS is) {
new IEStatementModel().updateData(is);
}
public void formatData() {
new IEStatementModel().formatData();
}
}
模型
关于数据库存储过程的具体操作会在SQLServer专栏下另开文章
1、ConnectDataBase(接口)
为什么定义接口:定义重复行为规范(如连接数据库进行操作必定要打开资源和关闭资源,但不同数据库具体连接方式不一样,以下以SQLServer为例)
public interface ConnectDataBase {
String url=null;
String user=null;
String password=null;
void openConnection();
void closeConnection();
}
2、ConnectSQLServer(抽象类)
为什么在抽象类中实现开闭资源方法:减少代码冗余,后续所有关于数据库的操作都必须进行资源开闭
为什么不定义增删改查的抽象方法:传入参数不同
public abstract class ConnectSQLServer implements ConnectDataBase{
protected Connection conn;
protected String url="jdbc:sqlserver://localhost:1433;DatabaseName=Financing";
protected String user="sa";
protected String password="123";
public void openConnection() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn=DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException e) {
System.out.println("找不到数据库资源");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接错误");
e.printStackTrace();
}
}
public void closeConnection() {
try {
conn.close();
} catch (SQLException e) {
System.out.println("数据库资源关闭错误");
e.printStackTrace();
}
}
}
3、数据库操作具体实现
实现基本的增删改查和格式化操作,具体不作过多描述,届时可参考SQLServer专栏
自定义异常类
1、先写一个父类,继承Exception或RuntimeException
实现构造方法和getMessage方法
public abstract class BaseException extends Exception{
private String message;
public BaseException(String msg)
{
this.message = msg;
}
public String getMessage() {
return message;
}
}
2、自定义异常
public class MoneyFormatException extends BaseException{
public MoneyFormatException(String msg) {
super(msg);
}
public static class unNumExecution extends BaseException{//非数字
public unNumExecution(String msg) {
super(msg);
}
public String getMessage(String msg){
return msg;
}
}
}
3、具体调用
try {
if (!isNum(txt1.getText())) {
throw new MoneyFormatException.unNumExecution("输入非数字金额,有误!");
} catch (unNumExecution e1) {
System.out.println(e1.getMessage());
}
整个项目大致就是这样,编程菜鸟,如有不妥,烦请指教