java日历小程序的时间更新错误

COOL程序小白 发布于 2018/08/07 08:20
阅读 116
收藏 1

有三个类一个接口,代码分别如下

第一个类:

package com.lj.oo1;
/*
 * 处理万年历当中所有的日历操作
 */

import java.util.Calendar;
import java.util.GregorianCalendar;

import com.lj.oo2.FrameJieMian;
import com.lj.oo2.JieMianinterface;

public class CalendarAction {
    private Calendar cal;                         //一个日历引用,所有的日历操作都是对该引用操作
    private JieMianinterface jMian;               //需要一个界面
    public CalendarAction() {
        cal=Calendar.getInstance();              //获取程序启动时的时间
        jMian=new FrameJieMian(this);            //给这个视图new一个对象
        updateCalendar();
    }
    
    //改变年份
    public void changeYear(String year) {
        cal.set(Calendar.YEAR, Integer.parseInt(year));//第二个参数是要传入的值,第一个是要改变的值
        this.updateCalendar();
        
    }
    
    //改变月份
    public void changeMonth(String month) {
        cal.set(Calendar.MONTH, Integer.parseInt(month)-1);
        this.updateCalendar();
        
        
    }
    
    public void updateCalendar() {
        //添加输入功能,更新界面
                //获得当前月的最大天数
                int maxDay=cal.getActualMaximum(Calendar.DAY_OF_MONTH);                    //方法是获取某一个字段的最大值
                //获得当前月的第一天是当前周的第几天
                Calendar c= new GregorianCalendar();              //获得一个日历对象
                c.set(Calendar.DATE, 1);//括号里分别是当前年,当前月,第一天放进去
                int begin=cal.get(Calendar.DAY_OF_WEEK);           //获得当前年当前月第一天是星期几
                //获得当前天是当前月第几天
                //?
                int currentDay=cal.get(Calendar.DAY_OF_MONTH);
                //
                jMian.setCalendar(maxDay, currentDay, begin);
    }

    public Calendar getCal() {
        return cal;
    }

    public void setCal(Calendar cal) {
        this.cal = cal;
    }

    public JieMianinterface getjMian() {
        return jMian;
    }

    public void setjMian(JieMianinterface jMian) {
        this.jMian = jMian;
    }

    

}
 

第二个类:

package com.lj.oo2;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.lj.oo1.CalendarAction;

public class FrameJieMian extends JFrame implements JieMianinterface {

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;     //主面板
    private JPanel northPane;       //放按钮面板的面板
    private JPanel centerPane;      //中间的日期面板
    private JPanel buttonPane;      //按钮面板
    
    private JButton labelYear,labelMonth;     //用来显示文字,年份,月份
    private JButton buttonPreYear,buttonNextYear;     //上一年,下一年按钮
    private JButton buttonPreMonth,buttonNextMonth;
    private JComboBox<Object> boxYear,boxMonth;                 //年,月下拉列表
    
    private JLabel[] labelDays;                        //声明label数组来表示那些日期
    private CalendarAction action;                     //包含日历逻辑的action对象引用
    
    
    public FrameJieMian( CalendarAction action) {
        this.action=action;//给 action赋值
        initView();
    }

    @Override
    public void initView() {
        //设置Frame
        this.setTitle("日历");
        this.setSize(500, 400);
        
        //初始化主控件
        initContentPane();                     //封装初始化主控件的操作
        this.setContentPane(contentPane);       //把contentPane放到Frame面板里面来
        
        //设置窗体的位置,让其居中
        Dimension d=Toolkit.getDefaultToolkit().getScreenSize();
        int screenWidth=d.width;
        int screenHeight=d.height;
        this.setLocation((screenWidth-this.getWidth())/2, (screenHeight-this.getHeight())/2);
        
        //关闭窗口
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        //窗口大小可改变
        this.setResizable(true);
    
        
    }
    
    //初始化主控件
     private void initContentPane() {
        contentPane=new JPanel(new BorderLayout());  //创建具有指定布局的Jpanel
        northPane =new JPanel(new BorderLayout());
        centerPane =new JPanel(new GridLayout(7, 7));//设置面板为7行7列
        buttonPane =new JPanel();             //默认为flowLayout
        
        labelYear=new JButton("年份");
        labelMonth=new JButton("月份");
        buttonPreYear=new JButton("<<");   //上一年
        buttonNextYear=new JButton(">>");  //下一年
        buttonPreMonth=new JButton("<<");  //上一个月
        buttonNextMonth=new JButton(">>"); //下一个月
        
        boxYear=new JComboBox<>();
        initBoxYear();         //封装了给下拉列表赋值的操作
        boxMonth=new JComboBox<>();
        initBoxMonth();         //封装了给下拉列表赋值的操作
        
        //把按钮放到按钮面板里面
        buttonPane.add(labelYear);
        buttonPane.add(buttonPreYear);
        buttonPane.add(boxYear);
        buttonPane.add(buttonNextYear);
        buttonPane.add(labelMonth);
        buttonPane.add(buttonPreMonth);
        buttonPane.add(boxMonth);
        buttonPane.add(buttonNextMonth);
        
        //把按钮面板放到northpanel
        northPane.add(buttonPane);   //把buttonPane放到northPane的中间位置
        
         //初始化放日期的Label
        labelDays=new JLabel[49];
        for (int i = 0; i < labelDays.length; i++) {
            labelDays[i]=new JLabel("",JLabel.CENTER);//JLabel里面的文字居中
            centerPane.add(labelDays[i]);                   //把每一个元素都放进去
            
        }
        
        //把northPane和centerPane放到主面板里
        contentPane.add(northPane, BorderLayout.NORTH);
        contentPane.add(centerPane, BorderLayout.CENTER);
        
        //给年份下拉列表添加事件监听器
                                 /*↓↓↓这是一个接口,new接口后应该写一个类体*/
        boxYear.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                String year=boxYear.getSelectedItem().toString();
                action.changeYear(year);
                
            }
        });
        
        boxMonth.addActionListener(new ActionListener() {
                    
            @Override
            public void actionPerformed(ActionEvent e) {
                String month=boxMonth.getSelectedItem().toString();
                action.changeMonth(month);            
            }
        });
        
        
        buttonPreYear.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                int resetYear=Integer.parseInt(boxYear.getSelectedItem().toString())-1;
                if(resetYear<1) {
                    resetYear=9999;
                }
                boxYear.setSelectedIndex(resetYear-1);
                action.changeYear(resetYear+"");        //转换成字符串类型
            }
        });      
        
        
        buttonNextYear.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                int resetYear=Integer.parseInt(boxYear.getSelectedItem().toString())-1;
                boxYear.setSelectedIndex(resetYear+1);
                action.changeYear(resetYear+""); 
                
            }
        });  
        
        
        buttonPreMonth.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //获得改变后的月
                int resetMonth=Integer.parseInt(boxMonth.getSelectedItem().toString())-1;
                boxMonth.setSelectedIndex(resetMonth-1);
                //修改日历的月
                //修改下拉列表
                if(resetMonth<1) {
                    resetMonth=12;
                    //按一下改变上一年的操作就能同时完成改变年的下拉列表和年的日历
                    buttonPreYear.doClick();
                }    
                action.changeMonth(resetMonth+"");   
            }
        });  
        
        
        buttonNextMonth.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                //获得改变后的月
                int resetMonth=Integer.parseInt(boxMonth.getSelectedItem().toString())-1;
                //修改下拉列表
                boxMonth.setSelectedIndex(resetMonth+1);
                if(resetMonth>12) {
                    resetMonth=1;
                    //按一下改变上一年的操作就能同时完成改变年的下拉列表和年的日历
                    buttonNextYear.doClick();
                }    
                //修改日历的月
                action.changeMonth(resetMonth+"");   
                
            }
        });  
        
         
    }
     /*
      * 封装给下拉列表赋值的操作
      */

     private void initBoxYear() {
            
            for (int i = 1; i < 10000; i++) {
                boxYear.addItem(i);                        //传一个int形向上转型成封装类
            }
            //设置下拉列表的选中项是当前年
            int year=action.getCal().get(Calendar.YEAR);
            boxYear.setSelectedIndex(year-1);
            
    }
     
    private void initBoxMonth() {
        for (int i = 1; i <= 12; i++) {
            boxMonth.addItem(i);
        }
        int month=action.getCal().get(Calendar.MONTH);
        boxMonth.setSelectedIndex(month);           //月份返回的是当前月减一,所以这里不用减一        
    }

    

    @Override
    public void showView() {
        this.setVisible(true);
    }

    @Override
    public void setCalendar(int maxDay, int currentDay, int begin) {
        //给前七个Label赋属性
        String[] week=new String[] {"日","一","二","三","四","五","六"};
        for (int i = 0; i < week.length; i++) {
            labelDays[i].setText(week[i]);    //给文字赋值用setText
            
            
        //初始化Label的颜色
            for (int m = 0; m < labelDays.length; m++) {
                labelDays[m].setForeground(Color.BLACK);
            }
            //把日期添加到对应的Label中
            for (int j = 1; j <= maxDay; j++) {
                String str=j<=9?"0"+j:j+"";
                labelDays[begin+j-2+7].setText(str);
                if(currentDay==j) {
                    labelDays[begin+j-2+7].setForeground(Color.BLUE);
                }
            }
            
        }

    }

}
 

 

 

测试类:

package com.lj.test;

import com.lj.oo1.CalendarAction;

public class CanlendarTest {

    public static void main(String[] args) {
        CalendarAction action =new CalendarAction();           //通过Action获得Jiemian
        action.getjMian().showView();
        
        
    }

}
 

日历更新感觉写的没错,但是运行结果

每一个月的日历都不正确,甚至出现重复的日期,java初学者,诚心求各位大神指点,谢谢!

加载中
0
静以修身2025
静以修身2025

用Calendar 获取月份需要加一,希望能有帮助

返回顶部
顶部