package mywork;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.border.Border;
public class CalendarNotepad extends JFrame implements ActionListener{
//事件监听器,一些接口声明,在接口中定义事件处理方法。
//如鼠标单击,编写时间处理过程,需要实现ActionListener接口。
private int year;
private int month;
private int day;
private int currentYear;
private int currentMonth;
private int currentDay;
String[] YEAR;
String[] MONTH;
String[] dayNum;
//实例
JPanel contentPane;//JPanel 中间容器(内容)
MyCalendar leftPane;//日历
Notepad rightPane;//记事
JPanel topPane;//顶部容器
NoteList notePane;//查看搜索
JLabel seletedDay;
JButton previousYear;//年左
JButton nextYear;//年右
JButton previousMonth;//月左
JButton nextMonth;//月右
JButton currentBtn;//当前日期
JButton allNoteBtn;//记事列表
JComboBox<String> yearComboBox;//年下拉组件
JComboBox<String> monthComboBox;//月下拉组件
MyComboBoxModel yearModel;//MyComboBoxModle继承了DefaultComboBoxModel<String>是一个下拉容器?
MyComboBoxModel monthModel;//同上
JLabel currentTime;
/*Font是JAVA中的字体类,PLAIN是Font类中的静态常量( static final ) ,表示是:普通样式常量。其他可用样式为:BOLD :粗体样式常量 ,ITALIC: 斜体样式常量.如可以如下初始化对象:Font textFont = new Font("宋体" , Font.BOLD , 23);该字体表示23磅粗体的宋体字。*/
Font font = new Font("楷体",Font.PLAIN, 14);
String filePath;//写日记的字符串(地址)
CalendarMouseListener cml = new CalendarMouseListener();//line346 CanlendarMouseListener 实现了MouseListener接口
NoteListMouseListener nml = new NoteListMouseListener();//同上
/*Border的使用*/
/*JPanel P1=new JPanel();
* P1.setBorder(BorderFactory.createRaisedBevelBorder();)
* p2.add(new JLable("XX边框"));
* panel.add(p2);
*/
/*日历边框*/
Border borderWeeks = BorderFactory.createRaisedBevelBorder();//边界布局,创建边框。创建一个凸起的斜面的边,用明亮色调的组件的当前背景色突出,和黑暗的阴影的阴影。(在凸起的边框中,突出部分位于顶部,阴影位于下方)。
Border borderDays = BorderFactory.createRaisedBevelBorder();//同上
Color mouseColor = new Color(198,226,255);//鼠标在日历界面边框颜色
Color noteColor = new Color(137,104,205);//保存日记之后日期变成的颜色
Border insideBorder = BorderFactory.createLineBorder(mouseColor, 5);//选定日期时颜色和边框大小
Border seletedBorder = BorderFactory.createCompoundBorder(borderDays,insideBorder);//createCompoundBorder创建一个具有 null 内部边缘和 null 外部边缘的合成边框。复合边界
// Border seletedBorder = BorderFactory.createLineBorder(mouseColor, 5);
/*设置主窗口*/
public CalendarNotepad(){
setTitle/*super*/("日历记事本");
setBounds(200,50,1100,630);//坐标,宽高
setResizable(false);//是否可以自由改变大小,否
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭,EXIT_ON_CLOSE是直接关闭程序。JFrame顶层窗口
/*try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); //windows界面风格
}catch (Exception e) {
e.printStackTrace();
} */ /*Swing的外观是不依赖操作系统的。这里指定的是Windows应用程序的外观*/
init();//显示日历本界面里的组件
setVisible(true);//日历本界面可见
}
/*进行初始化*/
private void init(){
/*calendar是一个类
* Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。*/
year=Calendar.getInstance().get(Calendar.YEAR);//获取年。getInstance是使用默认时区和区域设置获取日历。返回的日历是基于默认时区格式的默认时区中的当前时间。
currentYear = year;
month=Calendar.getInstance().get(Calendar.MONTH)+1;//获取月必须加1
currentMonth = month;
day=Calendar.getInstance().get(Calendar.DAY_OF_MONTH);//获取日,返回的是今天是当前月的第几天
currentDay = day;
/*创建对象*/
contentPane = new JPanel();
leftPane = new MyCalendar();
rightPane = new Notepad();
topPane = new JPanel();
notePane = new NoteList();
previousYear = new JButton("<");
nextYear = new JButton(">");
previousMonth = new JButton("<");
nextMonth = new JButton(">");
currentBtn = new JButton("当前日期");
allNoteBtn = new JButton("记事列表");
currentTime = new JLabel("");
yearModel = new MyComboBoxModel("YEAR");//调用函数创建年
monthModel = new MyComboBoxModel("MONTH");//调用函数创建月
yearComboBox = new JComboBox<String>(yearModel);//下拉框,上面获取了年,放入下拉框
monthComboBox = new JComboBox<String>(monthModel);//下拉框,同上
yearComboBox.setSelectedItem(yearModel.getElementAt(year-1900));//getElementAt返回指定索引处的组件。此时year是2017-1990返回的是2017这个位置,即开始年的下拉框中显示的是当前的日期
/*SelectedItem
* 属性设置为一个对象时,ComboBox尝试使该对象成为列表中当前选定的对象。
* 如果在列表中找到了该对象,则将它显示在ComboBox的编辑部分,
* 并且将SelectedIndex属性设置为相应的索引。*/
//System.out.print(month-1);
monthComboBox.setSelectedItem(monthModel.getElementAt(month-1));//同上
notePane.noteTable.addMouseListener(nml);//notePane是NoteList的一个对象 noteTable是NoteList中JTable的一个对象
yearComboBox.addActionListener(this);//this指对象本身,换成yearComboBox
monthComboBox.addActionListener(this);
previousYear.addActionListener(this);
nextYear.addActionListener(this);
previousMonth.addActionListener(this);
nextMonth.addActionListener(this);
currentBtn.addActionListener(this);//当前日期
rightPane.save.addActionListener(this);//保存
rightPane.delete.addActionListener(this);//删除
allNoteBtn.addActionListener(this);//查看全部
/*未设置Layout时,java默认为flowLayout布局的,
* 设置为null即为清空布局管理器,之后添加组件,
* 常常是设置组件左上角坐标相对于容器左上角(0,0)的x,y值来确定组件的位置,
* 即使更改容器大小也不会改变位置。这种方式常常用于窗体大小固定的容器里。*/
topPane.setLayout(null);
topPane.add(previousYear);
topPane.add(yearComboBox);
topPane.add(nextYear);
topPane.add(previousMonth);
topPane.add(monthComboBox);
topPane.add(nextMonth);
topPane.add(currentBtn);//当前日期
topPane.add(allNoteBtn);//记事列表
topPane.add(currentTime);//当前时间 下面通过calendar类获取
/*设置大小*/
previousYear.setBounds(0, 0, 50, 30);
yearComboBox.setBounds(55,0,70,30);
nextYear.setBounds(130,0,50,30);
previousMonth.setBounds(210, 0, 50, 30);
monthComboBox.setBounds(265,0,55,30);
nextMonth.setBounds(325,0,50,30);
currentBtn.setBounds(400,0,100,30);
allNoteBtn.setBounds(520,0,100,30);
currentTime.setBounds(650,0,350,30);
setContentPane(contentPane);////把contentPane对象设置成为frame的内容面板,contentPane是JPenal的一个对象
/*前面设定了实例,在这里把这些事例加入到面板中*/
contentPane.setLayout(null);
contentPane.add(leftPane);
contentPane.add(topPane);
contentPane.add(rightPane);
topPane.setBounds(20, 20, 1000, 50);//顶部
leftPane.setBounds(20, 80, 600, 500);//日历
rightPane.setBounds(650, 80, 400, 500);//记事本
notePane.setBounds(20, 80, 600, 500);//记事列表
/*dayN
评论2