java-日曆記事本總結
日曆記事本使用swing+基礎知識來完成,因為要考試加上實訓(最主要還是太菜了),前前後後用了將近一個星期完成,因為時間原因沒有對介面進行美化,只是實現了功能,以後有機會再進行美化,介面如下:
介面左邊是日曆顯示,可通過按鈕和下拉框選擇年,月,當前日期按鈕返回到當前日期,記事列表顯示所有記事,右邊是記事區,下方是儲存和刪除按鈕。
日曆記事本就是靠著各種事件監聽再註冊完成的,沒有太大的難度,就只寫些我在完成的過程中遇到的問題:
1.java.lang.NumberFormatException: For input string: ""
這個異常是我第一次見,上網搜查後得知是我在將String類轉換為integer 時,Integer.parseInt()為空值,導致出現了錯誤,Integer.parseInt()值不能為空或者為null
2.SimpleDateFormat和Timer,TimerTask
介面右上角有個當前時間的顯示,要求秒數會自動變化,起初我是想用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)));
獲得到了時間,接下來就是使用定時間讓時間能夠每秒+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);//一秒鐘後開始執行,每過一秒執行一次
使用者兩個類就可以實現時間自動加一秒
3.卡片佈局器(CardLayout)
當點選事件列表時,左邊的日曆表會變成表格顯示所有記事的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;}
4.建立檔案
之前一直不知道怎樣把每個記事都單獨存為一個檔案,上網查以後才知道只需要給定父抽象路徑名和子路徑名字串就可建立一個file例項(基礎不夠牢固),
File(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中的當前日期,並將其作為檔名來建立檔案,這樣在後面表格獲得各個記事的時間時只需要獲得檔名即可
5.表格的重新整理
剛開始的時候,每次點選表格列表時,上一次顯示的表格並沒有,會一直疊加下去
後面增加了一個判斷條件,第一次點選時,把所有記事新增到表格中,並把cancel=2,再往後每次點選記事列表時,先把前一次的表格全部刪除,再將所有記事重新新增到表格中。
if(cancel==2){
listCount=0;
while(model.getRowCount()>0){//把表格進行重新整理,下次顯示的時候重頭開始顯示
//System.out.println(model.getRowCount());
model.removeRow(model.getRowCount()-1);
}
}
這樣子每次點選記事列表的時候,表格不會重新增加。
完整的程式碼在我的GitHub上