自制日历java

简介: 自制日历java
package pac02;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.*;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Month;
import java.util.Iterator;
import java.util.LinkedList;

public class MyCourseDesign {
    public static void main(String[] args) {
        new InitWindow();
    }
}

class MyTable implements ActionListener{        //view
    JButton button;         //按钮确定输入
    JButton nextMonth;
    JButton previousMonth;
    JButton TableBack;
    JTextField inputYear;   //输入年份
    JComboBox<String>inputmonth; //下拉框选择月份
    MyPolice police;        //确定按钮的监视器
    JLabel  yearLabel;      //提示年的标签
    JLabel monthLabel;      //提示月的标签
    JLabel NowLabel;
    JButton nowButton;
    MyCalnadar myCalnadar;    //显示日历的主体
    JPanel northPanel;
    JPanel centralPanel;
    JPanel southPanel;
    JLayeredPane layeredPane;
    JPanel allPanel;
    LocalDateTime timeNow;
    Timer time;
    Box panelBox;
    InitWindow win;

    MyTable(){
        init();
        allPanel.setVisible(true);
        allPanel.setBounds(200,200,700,500);
    }

    public void setMyFont(Font font,JComponent...x){
        for(JComponent c:x){
            c.setFont(font);
        }
    }

    public void init(){
        BorderLayout bord = new BorderLayout();
        allPanel = new JPanel();
        allPanel.setLayout(bord);
        TableBack = new JButton("返回");
        panelBox = Box.createVerticalBox();
        nextMonth = new JButton(">>");
        previousMonth = new JButton("<<");
        myCalnadar = new MyCalnadar();
        police = new MyPolice();
        time = new Timer(1000,this);
        time.start();
        button  =new JButton("显示");
        inputmonth = new JComboBox<>();
        inputYear = new JTextField(6);
        yearLabel  = new JLabel("输入年:");
        monthLabel  = new JLabel("请选择月:");
        northPanel = new JPanel();
        centralPanel = new JPanel();
        southPanel = new JPanel();
        allPanel = new JPanel();
        layeredPane = new JLayeredPane();
        String []s1=new String[12];
        timeNow = LocalDateTime.now();
        NowLabel = new JLabel("现在的时间:"+timeNow.getYear()+"年"+timeNow.getMonth()+"月"+timeNow.getDayOfMonth()+"日"+timeNow.getHour()+":"+timeNow.getMinute()+":"+timeNow.getSecond());
        for (int i = 1; i <= 12; i++) {
            s1[i-1] = new String(String.valueOf(i));
            inputmonth.addItem(s1[i-1]);
        }
        setWin(win);
        police.setView(this);
        myCalnadar.setView(this);
        myCalnadar.setPanel(centralPanel);
        button.addActionListener(police);
        Font font = new Font("宋体",Font.BOLD,20);
        Font font01 = new Font("楷体",Font.BOLD,30);
        setMyFont(font,yearLabel,monthLabel,inputYear,inputmonth,button,nextMonth,previousMonth,NowLabel,button,TableBack);
        northPanel.add(TableBack);
        northPanel.add(yearLabel);
        northPanel.add(inputYear);
        northPanel.add(monthLabel);
        northPanel.add(inputmonth);
        northPanel.add(button);
        northPanel.add(previousMonth);
        northPanel.add(nextMonth);

        TableBack.addActionListener(police);

        previousMonth.addActionListener(police);
        nextMonth.addActionListener(police);
        nowButton= new JButton("");
        nowButton.setFont(font01);
        panelBox.add(nowButton);
        panelBox.add(Box.createVerticalStrut(4));
        panelBox.add(NowLabel);
        southPanel.add(panelBox);
        allPanel.add(northPanel,BorderLayout.NORTH);
        allPanel.add(centralPanel,BorderLayout.CENTER);
        allPanel.add(southPanel,BorderLayout.SOUTH);

        //初始时使日历显示2021年1月的日历
        inputYear.setText(2021+"");
        myCalnadar.setYear(2021);
        myCalnadar.setMonth(1);
        myCalnadar.showCalnadar();
        nowButton.setText("2021年1月日历");
    }

    public void actionPerformed(ActionEvent ae){
        //实现计时器功能
        time.start();
        LocalDateTime timeNow = LocalDateTime.now();
        NowLabel.setText("现在的时间:"+timeNow.getYear()+"年"+police.Convers(timeNow.getMonth())+"月"+timeNow.getDayOfMonth()+"日"+timeNow.getHour()+":"+timeNow.getMinute()+":"+timeNow.getSecond());
    }

    public void setWin(InitWindow win){
        this.win = win;
    }

    public void setPanel(JPanel panel){
        this.allPanel=panel;
    }

}

class MyCalnadar{               //Module
    int year;
    int month;
    GridLayout grid;
    JPanel panel;
    MyTable view;
    public void setView(MyTable view){
        this.view=view;
    }

    public void setPanel(JPanel panel){
        this.panel = panel;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public int getMonth() {
        return month;
    }

    public int PrintSpace(DayOfWeek x){
        switch (x){
            case MONDAY -> {
                return 0;
            }
            case TUESDAY -> {
                return 1;
            }
            case WEDNESDAY -> {
                return 2;
            }
            case THURSDAY -> {
                return 3;
            }
            case FRIDAY -> {
                return 4;
            }
            case SATURDAY -> {
                return 5;
            }
            case SUNDAY -> {
                return 6;
            }
            default -> {
                return -1;
            }
        }
    }

    public void showCalnadar(){
        Font font02 = new Font("楷体",Font.PLAIN,30);
        panel.setFont(font02);
        panel.setSize(100,100);
        Font font01 = new Font("宋体",Font.BOLD,20);
        panel.removeAll();
        grid = new GridLayout(7,7);
        panel.setLayout(grid);
        LocalDate date = LocalDate.of(year,month,1);
        int days = date.lengthOfMonth();
        LocalDate[]dateArray = new LocalDate[days];
        for (int i = 0; i < days; i++) {
            dateArray[i] =LocalDate.of(year,month,date.getDayOfMonth()+i);
        }
        String []name = new String[]{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
        //发现显示不了中文
        Label []titleWeek= new Label[7];
        Label []showDay = new Label[42];
        for(int i=0;i<7;i++){
            titleWeek[i] = new Label("",Label.CENTER);
            titleWeek[i].setText(name[i]+"");
            titleWeek[i].setFont(font01);
            panel.add(titleWeek[i]);
        }
        for(int i=0;i<42;i++){
            showDay[i] = new Label("",Label.CENTER);
            panel.add(showDay[i]);
        }
        int spaceOfMonth = PrintSpace(dateArray[0].getDayOfWeek());
        for (int i = 0; i < spaceOfMonth; i++) {
            showDay[i].setText("");
        }
        for (int i = spaceOfMonth,j=0; j < days; j++,i++) {
            showDay[i].setText(""+dateArray[j].getDayOfMonth());
        }
        panel.repaint();
    }
}

class MyPolice implements ActionListener {     //Controller
    MyTable view;
    int year,month;
    boolean isShow=true;
    boolean canEdit = true;
    Font font = new Font("宋体",Font.BOLD,17);
    public void setView(MyTable view){
        this.view=view;
    }
    public void actionPerformed(ActionEvent ae){
        if(ae.getSource()== view.TableBack){
            view.win.card.show(view.win.allPanel,"firstPanel");
        }
        if(ae.getSource()==view.button){
            //显示日历的主体
            if(view.inputYear.getText()==null){
                //如果根本没有输入年份
                canEdit = false;
                JLabel label1 = new JLabel("请输入年份!!!");
                label1.setFont(font);
                label1.setBackground(Color.RED);
                JOptionPane.showMessageDialog(view.allPanel,label1,"提示输入提醒",JOptionPane.ERROR_MESSAGE);
            }
            else{
                canEdit = true;
            }
            try{
                //尝试看看输入的年份有没有其他字符
                year = Integer.parseInt(view.inputYear.getText());
                canEdit = true;
            }
            catch (NumberFormatException exp){
                canEdit = false;
                JLabel label1 = new JLabel("输入的年份不要包含除数字之外的其他格式!!!");
                label1.setFont(font);
                view.inputYear.setText(2021+"");
                label1.setForeground(Color.RED);
                JOptionPane.showMessageDialog(view.allPanel,label1,"输入格式提醒",JOptionPane.ERROR_MESSAGE);
                isShow=false;
                view.inputYear.requestFocus();
            }
            if(view.inputYear.getText()!=null&&(year>3500||year<1500)){
                //检查输入的年份有没有超出范围
                canEdit = false;
                JLabel label1 = new JLabel("年份超出范围!请在1500-3500之间输入");
                label1.setFont(font);
                view.inputYear.setText("2021");
                label1.setForeground(Color.RED);
                JOptionPane.showMessageDialog(view.allPanel,label1,"超出范围提醒",JOptionPane.ERROR_MESSAGE);
                isShow=false;
//                view.inputYear.setText(null);
                view.inputYear.requestFocus();
            }
            else{
                canEdit = true;
            }
            try{
                //操作选中的月份
                int month = Integer.parseInt(view.inputmonth.getSelectedItem().toString());
                canEdit = true;
            }
            catch (Exception exp){
                canEdit = false;
                JLabel label1 = new JLabel("您还未选择月份!!!");
                label1.setFont(font);
                label1.setForeground(Color.RED);
                JOptionPane.showMessageDialog(view.allPanel,label1,"提示选择提醒",JOptionPane.ERROR_MESSAGE);
                isShow=false;
            }
            //根据输入的数据显示日历
            int year = Integer.parseInt(view.inputYear.getText());
            int month = Integer.parseInt(view.inputmonth.getSelectedItem().toString());
            view.myCalnadar.setYear(year);
            view.myCalnadar.setMonth(month);
        }
        if(ae.getSource()==view.nextMonth){
            //按按钮以显示下一个月的日历
            if(canEdit){
                int year = view.myCalnadar.getYear();
                int month = view.myCalnadar.getMonth();
                if(month==12){
                    view.myCalnadar.setYear(year+1);
                    view.myCalnadar.setMonth(1);
                }
                else{
                    view.myCalnadar.setMonth(month+1);
                }
            }
            else{
                JLabel label1 = new JLabel("请先显示日历后再按按钮挑战月份!");
                label1.setFont(font);
                label1.setForeground(Color.RED);
                JOptionPane.showMessageDialog(view.allPanel,label1,"错误选择提醒",JOptionPane.ERROR_MESSAGE);
            }
        }
        if(ae.getSource()== view.previousMonth){
            //按按钮以显示上一个月的日历
            if(canEdit){
                int year = view.myCalnadar.getYear();
                int month = view.myCalnadar.getMonth();
                if(month==1){
                    view.myCalnadar.setYear(year-1);
                    view.myCalnadar.setMonth(12);
                }
                else{
                    view.myCalnadar.setMonth(month-1);
                }
            }
            else {
                JLabel label1 = new JLabel("请先显示日历后再按按钮挑战月份!");
                label1.setFont(font);
                label1.setForeground(Color.RED);
                JOptionPane.showMessageDialog(view.allPanel,label1,"错误选择提醒",JOptionPane.ERROR_MESSAGE);
            }
        }
        if(isShow&canEdit){
            //根据有没有错误数据来显示日历主体
            view.myCalnadar.showCalnadar();
            view.nowButton.setText(view.myCalnadar.getYear()+"年"+ view.myCalnadar.getMonth()+"月的日历");
            view.nowButton.setBackground(Color.WHITE);
        }
        isShow=true;
    }
    public int Convers(Month m){
        switch (m){
            case JANUARY -> {
                return 1;
            }
            case FEBRUARY -> {
                return 2;
            }
            case MARCH -> {
                return 3;
            }
            case APRIL -> {
                return 4;
            }
            case MAY -> {
                return 5;
            }
            case JUNE -> {
                return 6;
            }
            case JULY -> {
                return 7;
            }
            case AUGUST -> {
                return 8;
            }
            case SEPTEMBER -> {
                return 9;
            }
            case OCTOBER -> {
                return 10;
            }
            case NOVEMBER -> {
                return 11;
            }
            case DECEMBER -> {
                return 12;
            }
            default -> {
                return -1;
            }
        }
    }
}

class InitWindow extends JFrame implements ActionListener{
    JButton showCal;
    JButton showMes;
    JButton showOpe;
    JPanel CalPanel;
    JPanel MesPanel;
    JPanel OpePanel;
    JLabel imageLabel;
    JPanel imagePanel;
    JPanel allPanel;
    JPanel firstPanel;
    JLayeredPane layeredPane;
    ImageIcon icon;
    Box baseBox;
    Box box1;
    Box box2;
    Font font,font01;
    JLabel hiLabel;
    JLabel opeLabel;
    JLabel spaceLabel;
    JLabel imaLabel;
    CardLayout card;
    MessageWindow mesWin;
    MyTable tabWin;
    OperateWindow opeWin;

    InitWindow(){
        init();
        setBounds(200,200,700,500);
        setVisible(true);
        setTitle("自制多功能日历器");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void init(){
        mesWin = new MessageWindow();
        mesWin.setView(this);
        tabWin = new MyTable();
        tabWin.setWin(this);
        opeWin = new OperateWindow();
        opeWin.setView((this));
        card = new CardLayout();
        CalPanel = new JPanel();
        OpePanel = new JPanel();
        MesPanel = new JPanel();
        allPanel = new JPanel();
        firstPanel = new JPanel();
        allPanel.setLayout(card);
        allPanel.add("OpePanel",opeWin.allPanel);
        allPanel.add("MesPanel",mesWin.allPanel);
        allPanel.add("CalPanel",tabWin.allPanel);
        allPanel.add("firstPanel",firstPanel);
        //对应3个窗口
        showCal = new JButton("查看日历");
        showMes = new JButton("查看节日");
        showOpe = new JButton("查看日程");
        showOpe.addActionListener(this);
        showMes.addActionListener(this);
        showCal.addActionListener(this);

        font = new Font("微软雅黑",Font.ITALIC,20);
        font01 = new Font("宋体",Font.PLAIN,50);
        hiLabel = new JLabel("你好,Calendar");
//        imagePanel.setSize(icon.getIconWidth(),icon.getIconHeight());
//        imagePanel.add(imageLabel,BorderLayout.CENTER);

        setBox();

//        layeredPane.add(imagePanel,JLayeredPane.MODAL_LAYER);
//        layeredPane.add(baseBox,JLayeredPane.DEFAULT_LAYER);
        firstPanel.add(baseBox);
//        opePanel.add(hiLabel,BorderLayout.NORTH);
//        setLayeredPane(layeredPane);
        card.show(allPanel,"firstPanel");
        setMyFont(font,showOpe,showMes,showCal,spaceLabel,opeLabel);
        hiLabel.setFont(font01);
        add(allPanel);
        mesWin = new MessageWindow();

//        this.MesPanel = mesWin.allPanel;
    }

    public void setMyFont(Font font,JComponent...x){
        for(JComponent c:x){
            c.setFont(font);
        }
    }

    public void setBox(){
        opeLabel = new JLabel("功能选项");
        spaceLabel = new JLabel("               ");
        box1 = Box.createVerticalBox();
        box1.add(Box.createVerticalStrut(50));
        box1.add(opeLabel);
        box1.add(Box.createVerticalStrut(25));
        box1.add(showCal);
        box1.add(Box.createVerticalStrut(50));
        box1.add(showMes);
        box1.add(Box.createVerticalStrut(50));
        box1.add(showOpe);
        box2 = Box.createVerticalBox();
//        box2.add(Box.createVerticalStrut(50));
        box2.add(hiLabel);
        box2.add(Box.createVerticalStrut(50));
        box2.add(spaceLabel);
        box2.add(Box.createVerticalStrut(50));
        box2.add(spaceLabel);
        baseBox = Box.createHorizontalBox();
        baseBox.add(box1);
        baseBox.add(Box.createHorizontalStrut(100));
        baseBox.add(box2);
        baseBox.setOpaque(false);
        box1.setOpaque(false);
        box2.setOpaque(false);
    }

    public void actionPerformed(ActionEvent ae){
        if(ae.getSource()==showCal){
            card.show(allPanel,"CalPanel");
        }
        if(ae.getSource()==showMes){
            card.show(allPanel,"MesPanel");
        }
        if(ae.getSource()==showOpe){
            card.show(allPanel,"OpePanel");
        }
    }
}

class MessageWindow implements ActionListener{    //还有节假日的图片与信息没填
    Box baseBox;
    Box box1;
    Box box2;
    InitWindow view;
    JLabel imageLabelOfSolar;
    JLabel imageLabelOfFesti;
    JLabel showLabel;
    CardLayout card = null;
    JTextArea showAreaSolar;
    JTextArea showAreaFesti;
    JPanel panelOfSolar;
    JPanel panelOfFesti;
    JPanel allPanel;   //在主窗口显示的面板,以cardlayout布局
    JPanel firstPanel;
    ImageIcon icon;
    JComboBox<String>comboBoxOfSolar;
    JComboBox<String>comboBoxOfFesti;
    JButton enterSolar;
    JButton enterFesti;
    JButton solarButton,festiButton;
    JButton solarToFirst,festiToFirst,firstToMain;
    Font font;
    File file=null;
    FileReader read=null;
    BufferedReader reader=null;
    MessageWindow(){
        init();
        allPanel.setBounds(200,200,700,500);
//        allPanel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        allPanel.setVisible(true);
//        allPanel.setTitle("查看节气");
        allPanel.validate();
    }
    public void init(){
        font = new Font("微软雅黑",Font.PLAIN,20);
        card = new CardLayout();
        setSolarPanel();
        setFestiPanel();
        setFirstPanel();
        allPanel = new JPanel();
        allPanel.setLayout(card);
        allPanel.add("solar",panelOfSolar);
        allPanel.add("festi",panelOfFesti);
        allPanel.add("first",firstPanel);
        card.show(allPanel,"first");
        enterFesti.addActionListener(this);
        enterSolar.addActionListener(this);
        solarButton.addActionListener(this);
        festiButton.addActionListener(this);
        solarToFirst.addActionListener(this);
        festiToFirst.addActionListener(this);
        setMyFont(font,solarButton,festiButton,solarToFirst,festiToFirst,firstToMain);
    }
    public void actionPerformed(ActionEvent ae){
        if(ae.getSource()==firstToMain){
            view.card.show(view.allPanel,"firstPanel");
        }
        if(ae.getSource()==solarButton){
            card.show(allPanel,"solar");
        }
        if(ae.getSource()==festiButton){
            card.show(allPanel,"festi");
        }
        if(ae.getSource()==solarToFirst){
            card.show(allPanel,"first");
        }
        if(ae.getSource()==festiToFirst){
            card.show(allPanel,"first");
        }
        if(ae.getSource()==enterFesti){
            //这里要用文件操作
            showAreaFesti.setText(null);
            String str = comboBoxOfFesti.getSelectedItem().toString();
            icon = new ImageIcon(str+".png");
            imageLabelOfFesti.setIcon(icon);
            file = new File("festival.txt");
            try{
                read = new FileReader(file);
                reader = new BufferedReader(read);
                String tar=null;
                while((tar=reader.readLine())!=null){
                    if(tar.equals("0000"+str)){
                        String content = reader.readLine();
                        for (int i = 0; i < content.length(); i++) {
                            showAreaFesti.append(""+content.charAt(i));
                            if(i%8==0){
                                showAreaFesti.append("\n");
                            }
                        }
                    }
                }
                reader.close();
                read.close();
            }
            catch (IOException ioexp){
                showAreaSolar.setText("无资料");
            }
        }
        if(ae.getSource()==enterSolar){
            showAreaSolar.setText(null);
            String str = comboBoxOfSolar.getSelectedItem().toString();
            icon = new ImageIcon(str+".png");
            imageLabelOfSolar.setIcon(icon);
            file = new File("solar.txt");
            try{
                read = new FileReader(file);
                reader = new BufferedReader(read);
                String tar=null;
                while((tar=reader.readLine())!=null){
                    if(tar.equals("0000"+str)){
                        String content = reader.readLine();
                        for (int i = 0; i < content.length(); i++) {
                            showAreaSolar.append(""+content.charAt(i));
                            if(i%8==0){
                                showAreaSolar.append("\n");
                            }
                        }
                    }
                }
                reader.close();
                read.close();
            }
            catch (IOException ioexp){
                showAreaSolar.setText("无资料");
            }
            //showArea里面的内容也要用到文件操作
        }
    }

    public void setMyFont(Font font,JComponent...x){
        for(JComponent c:x){
            c.setFont(font);
        }
    }

    public void setSolarPanel(){
        solarToFirst = new JButton("返回");
        panelOfSolar = new JPanel();
        BorderLayout bord = new BorderLayout();
//        panelOfSolar.setLayout(bord);
        enterSolar = new JButton("确定");
        //二十四节气面板加入box和显示图片的label
        baseBox = Box.createHorizontalBox();
        showAreaSolar = new JTextArea(10,10);
        showAreaSolar.setEditable(false);
        imageLabelOfSolar = new JLabel();
        imageLabelOfSolar.setSize(250,300);
        /
//        icon = new ImageIcon("原始.png");
//        imageLabelOfSolar.setIcon(icon);
        /
        showLabel = new JLabel("请选择节气");
        comboBoxOfSolar = new JComboBox<>();
        String[]solar={"立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至","小寒","大寒"};
        for (String s : solar) {
            comboBoxOfSolar.addItem(s);
        }
        box1 = Box.createHorizontalBox();
        box1.add(new JScrollPane(showAreaSolar));
        box1.add(Box.createHorizontalStrut(12));
        box1.add(imageLabelOfSolar);
        box2 = Box.createHorizontalBox();
        box2.add(solarToFirst);
        box2.add(Box.createHorizontalStrut(10));
        box2.add(showLabel);
        box2.add(Box.createHorizontalStrut(10));
        box2.add(comboBoxOfSolar);
        box2.add(Box.createHorizontalStrut(30));
        box2.add(enterSolar);
        baseBox = Box.createVerticalBox();
        baseBox.add(box2);
        baseBox.add(Box.createVerticalStrut(20));
        baseBox.add(box1);
        panelOfSolar.add(baseBox,BorderLayout.CENTER);
        setMyFont(font,showAreaSolar,showLabel,comboBoxOfSolar,enterSolar);
    }

    public void setFestiPanel(){
        festiToFirst = new JButton("返回");
        String[] festi={"元旦","春节","清明节","妇女节","植树节","劳动节","青年节","端午节","儿童节","建党节","建军节","教师节","中秋节","国庆节"};
        comboBoxOfFesti = new JComboBox<>();
        for(String s:festi){
            comboBoxOfFesti.addItem(s);
        }
        showAreaFesti = new JTextArea(10,10);
        showAreaFesti.setEditable(false);
        showLabel = new JLabel("请选择节日:");
        enterFesti = new JButton("确定");
        panelOfFesti = new JPanel();
        imageLabelOfFesti = new JLabel();
//        icon = new ImageIcon("原始.png");
//        imageLabelOfFesti.setIcon(icon);
        imageLabelOfFesti.setSize(250,300);
        box1 = Box.createHorizontalBox();
        box1.add(festiToFirst);
        box1.add(Box.createHorizontalStrut(10));
        box1.add(showLabel);
        box1.add(Box.createHorizontalStrut(10));
        box1.add(comboBoxOfFesti);
        box1.add(Box.createHorizontalStrut(30));
        box1.add(enterFesti);
        box2 = Box.createHorizontalBox();
        box2.add(new JScrollPane(showAreaFesti));
        box2.add(Box.createHorizontalStrut(20));
        box2.add(imageLabelOfFesti);
        baseBox = Box.createVerticalBox();
        baseBox.add(box1);
        baseBox.add(Box.createVerticalStrut(20));
        baseBox.add(box2);
//        panelOfFesti.add(northPanel,BorderLayout.NORTH);
        panelOfFesti.add(baseBox,BorderLayout.CENTER);
        setMyFont(font,comboBoxOfFesti,showLabel,showAreaFesti,enterFesti);
    }

    public void setPanel(JPanel panel){
        this.allPanel=panel;
    }

    public void setView(InitWindow view){
        this.view=view;
    }

    public void setFirstPanel(){
        firstToMain = new JButton("返回");
        firstToMain.addActionListener(this);
        firstPanel = new JPanel();
        BorderLayout bord = new BorderLayout();
        firstPanel.setLayout(bord);
        solarButton = new JButton("查看二十四节气");
        festiButton = new JButton("查看节日");
        box1 = Box.createVerticalBox();
        box1.add(Box.createVerticalStrut(40));
        box1.add(solarButton);
        box2=Box.createVerticalBox();
        box2.add(Box.createVerticalStrut(40));
        box2.add(festiButton);
        baseBox = Box.createHorizontalBox();
        baseBox.add(Box.createHorizontalStrut(50));
        baseBox.add(box1);
        baseBox.add(Box.createHorizontalStrut(50));
        baseBox.add(box2);
        baseBox.add(Box.createHorizontalStrut(50));
        box1 = Box.createVerticalBox();
        box1.add(Box.createVerticalStrut(40));
        box1.add(firstToMain);
        baseBox.add(box1);
        baseBox.add(Box.createHorizontalStrut(50));
        firstPanel.add(baseBox,BorderLayout.CENTER);
    }
}

class OperateWindow implements ActionListener, ItemListener {
    CardLayout card = null;
    Box baseBox;
    Box box1;
    Box box2;
    Box box3;
    JPanel allPanel;
    JPanel viewPanel;
    JPanel addPanel;
    JPanel firstPanel;
    JPanel selectPanel;
    JButton viewButton;
    JButton addButton;
    JCheckBox[] checkArray;
    JButton enterOfView;
    JButton enterOfAdd;
    JButton viewBack;
    JButton addBack;
    JButton firstBack;
    JButton cleanButton;
    JComboBox<String> comboBox;
    JComboBox<String> comboBoxHour;
    JComboBox<String> comboBoxMinute;
    JTextArea inputArea;
    JLabel tipLabel;
    JLabel dateLabel;
    JLabel titleLabel;
    Font font01, font02;
    File file = null;
    FileReader read = null;
    BufferedReader Reader = null;
    FileWriter write = null;
    BufferedWriter Writer = null;
    InitWindow view;

    OperateWindow() {
        init();
        allPanel.setVisible(true);
        allPanel.setBounds(200, 200, 700, 500);
    }

    public void init() {
        font01 = new Font("微软雅黑", Font.PLAIN, 15);
        font02 = new Font("宋体", Font.BOLD, 20);
        checkArray = new JCheckBox[10];
        comboBoxHour = new JComboBox<>();
        comboBoxMinute = new JComboBox<>();
        for (int i = 0; i < 24; i++) {
            String hour = i + "";
            comboBoxHour.addItem(hour);
        }
        for (int i = 0; i < 60; i++) {
            String minute = i + "";
            comboBoxMinute.addItem(minute);
        }

        for (int i = 0; i < 10; i++) {
            checkArray[i] = new JCheckBox();
            checkArray[i].addItemListener(this);
        }

        createViewPanel();
        createAddPanel();
        createFirstPanel();

        allPanel = new JPanel();
        card = new CardLayout();
        allPanel.setLayout(card);
        allPanel.add("view", viewPanel);
        allPanel.add("add", addPanel);
        allPanel.add("first", firstPanel);
        card.show(allPanel, "first");
        setMyFont(font02, enterOfAdd, enterOfView, tipLabel, inputArea, addButton, viewButton, comboBoxHour, comboBoxMinute, dateLabel, firstBack);
        addButton.addActionListener(this);
        viewButton.addActionListener(this);
    }

    public void createViewPanel() {
        viewPanel = new JPanel();
        BorderLayout bord = new BorderLayout();
        viewPanel.setLayout(bord);
        tipLabel = new JLabel("您还有以下未完成的事项");
        enterOfView = new JButton("确定");
        viewBack = new JButton("返回");
        cleanButton = new JButton("清除");
        viewBack.addActionListener(this);
        enterOfView.addActionListener(this);
        cleanButton.addActionListener(this);
        tipLabel = new JLabel("您还有以下日程没完成");

        setMyFont(font02, tipLabel, cleanButton);
        showViewPanel();
    }

    public void setView(InitWindow view) {
        this.view = view;
    }

    public void createAddPanel() {
        addPanel = new JPanel();
        BorderLayout bord = new BorderLayout();
        addPanel.setLayout(bord);
        tipLabel = new JLabel("在未来一周内添加事件");
        inputArea = new JTextArea(5, 10);
        inputArea.requestFocus();
        comboBox = new JComboBox<>();
        enterOfAdd = new JButton("确定");
        enterOfAdd.addActionListener(this);
        addBack = new JButton("返回");
        addBack.addActionListener(this);
        LocalDate date = LocalDate.now();
        int count = 0;
        String str = null;
        setMyFont(font02, comboBox, tipLabel);
        setMyFont(font01, inputArea);
        while (count < 7) {
            int year = date.getYear();
            int month = date.getMonthValue();
            int Day = date.getDayOfMonth();
            str = year + "-" + month + "-" + Day;
            comboBox.addItem(str);
            date = date.plusDays(1);
            count++;
        }
        box1 = Box.createVerticalBox();
        box1.add(inputArea);
        box1.add(Box.createVerticalStrut(100));

        box2 = Box.createHorizontalBox();
        box2.add(addBack);
        box2.add(Box.createHorizontalStrut(10));
        dateLabel = new JLabel("选择日期");
        dateLabel.setFont(font02);
        box2.add(dateLabel);
        box2.add(Box.createHorizontalStrut(10));
        box2.add(comboBox);
        box2.add(Box.createHorizontalStrut(10));
        dateLabel = new JLabel("选择小时");
        dateLabel.setFont(font02);
        box2.add(dateLabel);
        box2.add(Box.createHorizontalStrut(10));
        box2.add(comboBoxHour);
        box2.add(Box.createHorizontalStrut(10));
        dateLabel = new JLabel("选择分钟");
        box2.add(dateLabel);
        box2.add(Box.createHorizontalStrut(10));
        box2.add(comboBoxMinute);

        addPanel.add(box2, BorderLayout.NORTH);
        addPanel.add(box1, BorderLayout.CENTER);
        addPanel.add(enterOfAdd, BorderLayout.SOUTH);
    }

    public void createFirstPanel() {
        firstBack = new JButton("返回");
        firstBack.addActionListener(this);
        firstPanel = new JPanel();
        BorderLayout bord = new BorderLayout();
        firstPanel.setLayout(bord);
        viewButton = new JButton("查看日程");
        addButton = new JButton("添加日程");
        box1 = Box.createVerticalBox();
        box1.add(Box.createVerticalStrut(40));
        box1.add(viewButton);
        box2 = Box.createVerticalBox();
        box2.add(Box.createVerticalStrut(40));
        box2.add(addButton);
        baseBox = Box.createHorizontalBox();
        baseBox.add(Box.createHorizontalStrut(50));
        baseBox.add(box1);
        baseBox.add(Box.createHorizontalStrut(50));
        baseBox.add(box2);
        baseBox.add(Box.createHorizontalStrut(50));
        box1 = Box.createVerticalBox();
        box1.add(firstBack);
        box1.add(Box.createVerticalStrut(80));
        baseBox.add(box1);
        baseBox.add(Box.createHorizontalStrut(50));
        firstPanel.add(baseBox, BorderLayout.CENTER);
    }

    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == enterOfAdd) {
            try {
                file = new File("ToDoList.txt");
                read = new FileReader(file);
                Reader = new BufferedReader(read);
                String str01 = null;
                int count = 0;
                while ((str01 = Reader.readLine()) != null) {
                    count++;
                }
                if (count == 10) {
                    JLabel warn = new JLabel("日程已经超出最大数!");
                    warn.setFont(font02);
                    JOptionPane.showMessageDialog(allPanel, warn, "超限提示框", JOptionPane.ERROR_MESSAGE);
                    inputArea.setText(null);
                    return;
                }
                Reader.close();
                read.close();

                int hour = Integer.parseInt(comboBoxHour.getSelectedItem().toString());
                int minute = Integer.parseInt(comboBoxMinute.getSelectedItem().toString());
                String hour02 = null;
                String minute02 = null;
                if (hour < 10) {
                    hour02 = "0" + hour;
                } else {
                    hour02 = hour + "";
                }
                if (minute < 10) {
                    minute02 = "0" + minute;
                } else {
                    minute02 = minute + "";
                }
                if (inputArea.getText().equals("")) {
                    JLabel warn = new JLabel("请至少输入一个字符");
                    warn.setFont(font02);
                    JOptionPane.showMessageDialog(this.allPanel, warn, "提醒输入框", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                String str02 = inputArea.getText().replace("\n", "");
                if (str02.length() == 0) {
                    JOptionPane.showMessageDialog(this.allPanel, "请至少输入一个字符", "提醒款", JOptionPane.ERROR_MESSAGE);
                    inputArea.setText(null);
                    inputArea.requestFocus();
                    return;
                }
                String mess = comboBox.getSelectedItem().toString() + "-" + hour02 + ":" + minute02 + str02;
                file = new File("ToDoList.txt");
                write = new FileWriter(file, true);
                Writer = new BufferedWriter(write);
                Writer.write(mess + "\n");
                Writer.close();
                write.close();
            } catch (IOException exp) {
            }
            inputArea.setText(null);
            inputArea.requestFocus();
            JLabel warn = new JLabel("创建日程成功!");
            warn.setFont(font02);
            JOptionPane.showMessageDialog(this.allPanel, warn, "提示框", JOptionPane.ERROR_MESSAGE);
        }
        if (ae.getSource() == viewButton) {
            card.show(allPanel, "view");
            showViewPanel();
        }
        if (ae.getSource() == addButton) {
            card.show(allPanel, "add");
        }
        if (ae.getSource() == viewBack) {
            card.show(allPanel, "first");
        }
        if (ae.getSource() == addBack) {
            card.show(allPanel, "first");
        }
        if (ae.getSource() == firstBack) {
            view.card.show(view.allPanel, "firstPanel");
        }
        if (ae.getSource() == cleanButton) {
            int n = JOptionPane.showConfirmDialog(this.allPanel, "确认全部清除?", "提醒框", JOptionPane.YES_NO_OPTION);
            if (n == JOptionPane.YES_OPTION) {
                file = new File("ToDoList.txt");
                try {
                    FileOutputStream out = new FileOutputStream(file);
                }
                catch (IOException exp) {}
                showViewPanel();
            }
        }
        if (ae.getSource() == enterOfView) {
            showViewPanel();
        }
    }

    public void setMyFont(Font font, JComponent... x) {
        for (JComponent c : x) {
            c.setFont(font);
        }
    }

    public void showViewPanel() {
        file = new File("ToDoList.txt");
        box2=Box.createVerticalBox();
//        if (file.length() == 0) {
//            JOptionPane.showMessageDialog(this.allPanel, "没有安排任何日程", "提醒框", JOptionPane.ERROR_MESSAGE);
//        }
        try {
            read = new FileReader(file);
            Reader = new BufferedReader(read);
            String str = null;
            int i = 0;
            String day01 = null;
            String day02 = null;
            while ((str = Reader.readLine()) != null) {
                day01 = str.substring(0, 10);
                if (day02 != null) {
                    if (!day02.equals(day01)) {
                        //如果上一条的日期和现在一条的日期不一样,则另外创建一个titlLabel;
                        titleLabel = new JLabel(day01);
                        titleLabel.setFont(font01);
                        box2.add(titleLabel);
                        box2.add(Box.createVerticalStrut(5));
                    }
                }
                if (day02 == null) {
                    titleLabel = new JLabel(day01);
                    titleLabel.setFont(font01);
                    box2.add(titleLabel);
                    box2.add(Box.createVerticalStrut(5));
                }
                day02 = day01;

                String rest = str.substring(10);
                String time = rest.substring(1, 6);  //几点几分
                String content = rest.substring(6); //代办事项
                checkArray[i] = new JCheckBox(content + "(" + time + ")");
                checkArray[i].setFont(font02);
                checkArray[i].addItemListener(this);
                box2.add(checkArray[i]);
                box2.add(Box.createVerticalStrut(1));
                i++;
            }
            Reader.close();
            read.close();

        } catch (IOException ioexp) {
        }
        viewPanel.removeAll();

        box1=Box.createHorizontalBox();
        box1.add(viewBack);
        box1.add(Box.createHorizontalStrut(20));
        tipLabel = new JLabel("您还有以下日程未完成:");
        tipLabel.setFont(font02);
        box1.add(tipLabel);

        baseBox = Box.createHorizontalBox();
        baseBox.add(Box.createHorizontalStrut(200));
        baseBox.add(enterOfView);
        baseBox.add(Box.createHorizontalStrut(20));
        baseBox.add(cleanButton);
        baseBox.add(Box.createHorizontalStrut(20));

        viewPanel.add(box1, BorderLayout.NORTH);
        viewPanel.add(box2,BorderLayout.CENTER);
        viewPanel.add(baseBox, BorderLayout.SOUTH);
    }

    public void itemStateChanged(ItemEvent it) {
        JCheckBox check = (JCheckBox) it.getSource();
        file = new File("ToDoList.txt");
        LinkedList<String> list = new LinkedList<>();
        try {
            read = new FileReader(file);
            Reader = new BufferedReader(read);
            String str = null;
            while ((str = Reader.readLine()) != null) {
                String regax = "[1234567890.:-]";
                String str1 = str.replaceAll(regax, "");
//                System.out.println(str1);
                if (!check.getText().contains(str1)) {
                    list.add(str);
                }
            }
            try {
                FileOutputStream out = new FileOutputStream(file);
            }
            catch (IOException ioe) {}
            Reader.close();
            read.close();
            write = new FileWriter(file);
            Writer = new BufferedWriter(write);
            Iterator<String> iter = list.iterator();
            while (iter.hasNext()) {
                String tar = iter.next();
//                System.out.println(tar);
                Writer.write(tar + "\n");
            }
            Writer.close();
            write.close();
        }
        catch (IOException exp) {}
    }
}

相关文章
|
存储 Java Linux
Java自制简易线程池(不依赖concurrent包)
实时上如上文中好几次提到,java.util.concurrent包里已经帮大家实现了一个很健壮、功能强大的线程池,大家不必再去造轮子了,使用不同的BlockingQueue就可以实现不同功能的线程池。举个栗子,比如使用DelayedWorkQueue就可以实现可以定期执行的线程池了。 甚至Executors为大家封装了更为简易的线程池创建接口,但是《Alibaba Java开发手册》强制不允许使用 Executors 去创建线程池,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
45 0
|
5月前
|
Java
java中强大的时间处理工具:Calendar类(日历类)
`Calendar`类是Java中用来处理日期和时间的类,提供了许多属性来获取日期和时间的不同部分,如年、月、日、小时等。`Calendar`的常用属性包括`YEAR`(年)、`MONTH`(月)、`DATE`/`DAY_OF_MONTH`(日)、`DAY_OF_YEAR`(一年中的第几天)、`DAY_OF_WEEK_IN_MONTH`(一月中第几个星期)、`DAY_OF_WEEK`/`WEEK_OF_MONTH`(星期)等。
96 0
|
6月前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
【5月更文挑战第2天】在自动化测试过程中,经常会遇到处理日期控件的点击问题。宏哥之前分享过一种方法,但如果输入框是`readonly`属性,这种方法就无法奏效了。不过,通过修改元素属性,依然可以实现自动化填写日期。首先,定位到日期输入框并移除`readonly`属性,然后使用`sendKeys`方法输入日期。这样,即使输入框设置了`readonly`,也能成功处理日期控件。
91 1
|
6月前
|
Java Android开发
日历/万年历【小游戏】(Java课设)
日历/万年历【小游戏】(Java课设)
54 1
日历/万年历【小游戏】(Java课设)
|
6月前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)
【5月更文挑战第1天】该文介绍了使用Selenium自动化测试网页日历控件的方法。首先,文章提到在某些Web应用中,日历控件常用于选择日期并筛选数据。接着,它提供了两个实现思路:一是将日历视为文本输入框,直接输入日期;二是模拟用户交互,逐步选择日期。文中给出了JQueryUI网站的一个示例,并展示了对应的Java代码实现,包括点击日历、选择日期等操作。
122 0
|
6月前
|
Java
用Java编写年份日历
用Java编写年份日历
|
6月前
|
Java
基于Java Swing实现的日历记事本系统【源码+报告文档】
基于Java Swing实现的日历记事本系统【源码+报告文档】
105 0
|
Java
Java练习题:控制语句_打印日历
Java练习题:控制语句_打印日历
51 1
|
开发框架 JavaScript Java
推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言
推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言
102 0
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。