日历记事本使用swing+基础知识来完成,因为要考试加上实训(最主要还是太菜了),前前后后用了将近一个星期完成,因为时间原因没有对界面进行美化,只是实现了功能,以后有机会再进行美化,界面如下:
界面左边是日历显示,可通过按钮和下拉框选择年,月,当前日期按钮返回到当前日期,记事列表显示所有记事,右边是记事区,下方是保存和删除按钮。
日历记事本就是靠着各种事件监听再注册完成的,没有太大的难度,就只写些我在完成的过程中遇到的问题:
这个异常是我第一次见,上网搜查后得知是我在将String类转换为integer 时,Integer.parseInt()为空值,导致出现了错误,Integer.parseInt()值不能为空或者为null
界面右上角有个当前时间的显示,要求秒数会自动变化,起初我是想用Date类去实现这个功能,但发现秒数没发变化,是固定的(也可能是我用的方法不对),总之最后我使用了Simple DateFormat和定时器来实现这个功能,Simple DateFormat是一个格式化Date以及解析字符串的工具,按照指定的格式对Date进行格式化,有多种用法,以下是我本次的使用
long timemillis = System.currentTimeMillis(); //返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
//转换日期显示格式
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E"); //格式:年 月 日 时:分:秒 星期
timeLabel.setText(" 当前时间: "+df.format(new Date(timemillis)));
返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
//转换日期显示格式
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E"); //格式:年 月 日 时:分:秒 星期
timeLabel.setText(" 当前时间: "+df.format(new Date(timemillis)));
获得到了时间,接下来就是使用定时间让时间能够每秒+1秒,这里用到了Timer,TimerTask,具体的任务由TimerTask来完成,Timer负责管理,有两种常用的,一种是使任务在指定时间被执行一次,另一种是从某一指定时间开始周期性地执行任务,我们这次用的是第二种
Timer time=new Timer();
TimerTask task=new TimerTask() {//设置定时器,在界面中显示时间
@Override
public void run() {
// TODO 自动生成的方法存根
long timemillis = System.currentTimeMillis();//返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
//转换日期显示格式
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E");
timeLabel.setText(" 当前时间: "+df.format(new Date(timemillis)));
}
};
time.schedule(task, 1000,1000);//一秒钟后开始执行,每过一秒执行一次
使用者两个类就可以实现时间自动加一秒
当点击事件列表时,左边的日历表会变成表格显示所有记事的ID,日期和记事内容,刚开始时没有想到卡片布局器,用了各种办法都没能实现表格和日历表之间的转换,在一次翻书的时候了解到了卡片布局器,发现是真的好用,于是将左边日历表改为卡片布局器,
card=new CardLayout();//创建卡片布局器对象
cardpanel=new JPanel(card);//将cardpanel布局设置为卡片布局器
cardpanel.add(leftCenter,"left");//将日历表添加到cardpanel中,名字为left
cardpanel.add(js,"js");//将表格添加到cardpanel中,名字为js
leftpanel.add(cardpanel, BorderLayout.CENTER);//将卡片布局器添加到容器中
if(!flag){//通过flag判断什么时候显示日历表,什么时候显示表格
card.show(cardpanel, "left");
flag=true;}
else if(flag){
card.show(cardpanel, "js");
flag=false;}
之前一直不知道怎样把每个记事都单独存为一个文件,上网查以后才知道只需要给定父抽象路径名和子路径名字符串就可创建一个file实例(基础不够牢固),
File(File parent, String child);
(File parent, String child);
这下就很容易了
String str=dateLabel.getText();//将要保存的年月日作为文件名
File file=new File("D://newfile//note",str);//创建出以str为文件名的文本
//FileOutputStream fo=new FileOutputStream(file);
FileWriter fw=new FileWriter(file,true);//把文本域中的文本保存到文件中
String ss=noteja.getText();
fw.write(ss);
//fo.close();
fw.close();
获得dateLabel中的当前日期,并将其作为文件名来创建文件,这样在后面表格获得各个记事的时间时只需要获得文件名即可
刚开始的时候,每次点击表格列表时,上一次显示的表格并没有,会一直叠加下去
后面增加了一个判断条件,第一次点击时,把所有记事添加到表格中,并把cancel=2,再往后每次点击记事列表时,先把前一次的表格全部删除,再将所有记事重新添加到表格中。
if(cancel==2){
listCount=0;
while(model.getRowCount()>0){//把表格进行刷新,下次显示的时候重头开始显示
//System.out.println(model.getRowCount());
model.removeRow(model.getRowCount()-1);
}
}
这样子每次点击记事列表的时候,表格不会重新增加。
完整的代码在我的GitHub上