Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 514|回复: 0

[Java基础知识]一个日历程序

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 21:46:45 | 显示全部楼层 |阅读模式
    程序运行图:


      
       
       
       

       
      

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    import java.util.Calendar;
    import java.util.Date;

    /**
    * 日历类, 提供日历功能
    */
    public class MonthSelector extends JPanel implements ActionListener, MouseMotionListener, MouseListener
    {
       final private String TITLES[] = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
       final private int ROW_HEIGHT = 20;
       final private int ROW_WIDTH = 40;

       private JTable table; // 表格
       private JLabel title; // 标题
       private JButton nextMonth; // 下个月份的按钮
       private JButton preMonth; // 上个月的按钮
       private JPanel top; // 顶部容器

       private int year; // 当前显示的年份
       private int month; // 当前显示的月份
       private int day; // 当前选择的日期
       private int week; // 当前选择的星期
       private int selectedX = -1;
       private int selectedY = -1;
       private int clickX = -1;
       private int clickY = -1;

    public MonthSelector(){
       Calendar cal = Calendar.getInstance();
       cal.setTime(new Date());

       year = cal.get(Calendar.YEAR);
       month = cal.get(Calendar.MONTH)+1;
       day = cal.get(Calendar.DAY_OF_MONTH)-1;
       week = cal.get(Calendar.DAY_OF_WEEK)-1;

       top = new JPanel(new FlowLayout(FlowLayout.CENTER));
       table = new JTable(7,7);

       table.setPreferredSize(new Dimension(ROW_WIDTH * 7, ROW_HEIGHT * 7));
       table.setRowHeight(ROW_HEIGHT);
       for(int i=0; i<TITLES.length; i++)
       table.setValueAt(TITLES,0,i);

       title = new JLabel();
       nextMonth = new JButton(">>");
       preMonth = new JButton("<<");
       top.add(preMonth);
       top.add(title);
       top.add(nextMonth);
       setTitle();
       table.setEnabled(false);
       // 设置按钮
       setLayout(new BorderLayout());

       add(top, BorderLayout.NORTH);
       add(table, BorderLayout.CENTER);

       preMonth.addActionListener(this);
       nextMonth.addActionListener(this);

       showMonth(); // 设置显示当前月份
       table.setCellSelectionEnabled(true);

       table.addMouseMotionListener(this);
       table.addMouseListener(this);
      }

    /**
    * 取得指定年份和月份的日期数
    * @return
    */
    public int getDaysOfMonth(int year, int month)
    {
       int Days[]= {31,28,31,30,31,30,31,31,30,31,30,31};
       // 判断是否闰年

       if( year % 400 == 0 || (year % 4 ==0 && year % 100 != 0)) // 说明是闰年
       Days[1] = 29;

       return Days[month-1];
      }

    /**
    * 取得指定月份的头一天的星期几
    * @param month
    * @return
    */
    public int getWeekOfFirstDay(int year, int month){
       Calendar cal = Calendar.getInstance();
       cal.set(Calendar.YEAR, year);
       cal.set(Calendar.MONTH, month - 1);
       cal.set(Calendar.DAY_OF_MONTH, 1);

       int result = cal.get(Calendar.DAY_OF_WEEK) - 1;
       return result ;
      }

    /**
    * 设置显示的标题
    */
    private void setTitle(){
       String m = String.valueOf(month);
       if(m.length() ==1) m = "0"+m;
       title.setText(String.valueOf(year)+"年"+m+"月");
    }

    /**
    * 显示月份
    */
    private void showMonth(){
       for(int x=0; x<7; x++)
       for(int y=1; y<7; y++) table.setValueAt("",y, x);

       int y = 1;
       int x = getWeekOfFirstDay(year, month);
       int maxDay = getDaysOfMonth(year,month);

       for(int i=0; i<maxDay; i++){
         table.setValueAt(new Integer(i+1),y,x);
         x ++;
        if(x>6){
                x=0;
                y++;
        }
       }
       repaint();
    }

    /**
    * 处理按钮
    * @param e
    */
    public void actionPerformed(ActionEvent e){
        if(e.getSource().equals(nextMonth)){
          month++;
          if(month>12){
              month = 1;
              year++;
          }
        }

        if(e.getSource().equals(preMonth)){
          month--;
          if(month<1){
                 month = 12;
                 year --;
          }
        }

        setTitle();
        showMonth();
    }

    /**
    * 绘制
    * @param g
    */
    public void paint(Graphics g){
        super.paint(g);

        // repaint Table First LINE
        g.fillRect(0,top.getHeight(), getWidth()-1, ROW_HEIGHT -1);
        g.setColor(Color.white);
        for(int i=0; i<7; i++)
        g.drawString((String)(table.getModel().getValueAt(0,i)),i*ROW_WIDTH, top.getHeight()+ ROW_HEIGHT - 3);

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.MONTH, month);
        cal.set(Calendar.DAY_OF_MONTH, day);
        int line = cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) + 1;
        int x = week * table.getWidth() / 7;
        int y = top.getHeight() + ROW_HEIGHT * line ;
        g.setColor(Color.black);
        g.drawRect(x+1,y+1, ROW_WIDTH-4, ROW_HEIGHT-4);
        if(selectedX >= 0 && selectedY>= 0 && ! table.getModel().getValueAt(selectedY,selectedX).equals("")){
           g.setColor(Color.blue);
           g.drawRect(selectedX * ROW_WIDTH+1, (selectedY + 2) * ROW_HEIGHT -1 ,ROW_WIDTH-4,ROW_HEIGHT-4);
          }

        if(clickY >= 0 && clickX >= 0 & ! table.getModel().getValueAt(clickY,clickX).equals(""))
        {
          g.setColor(Color.green);
          g.drawRect(clickX * ROW_WIDTH+1, (clickY + 2) * ROW_HEIGHT -1 ,ROW_WIDTH-4,ROW_HEIGHT-4);
        }
    }

    public void mouseDragged(MouseEvent e){}

    public void mouseMoved(MouseEvent e){
        if(e.getX()>0 && e.getY()<getWidth() && e.getY()> ROW_HEIGHT && e.getY()< ROW_HEIGHT * 7 )
         {
           selectedX = e.getX() / ROW_WIDTH;
           selectedY = e.getY() / ROW_HEIGHT;

           repaint();
         }
    }

    public void mouseClicked(MouseEvent e) {}

    public void mousePressed(MouseEvent e){
        if(e.getX()>0 && e.getY()<getWidth() && e.getY()> ROW_HEIGHT && e.getY()< ROW_HEIGHT * 7 )
          {
            clickX = e.getX() / ROW_WIDTH;
            clickY = e.getY() / ROW_HEIGHT;

           repaint();
         }
    }
    public void mouseReleased(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}

    /* --=[ 测试代码 ]=-- */
    public static void main(String[] args){
        JFrame frm = new JFrame();
        frm.getContentPane().setLayout(new BorderLayout());
        frm.getContentPane().add(new MonthSelector());
        frm.pack();
        frm.show();
       }
    }

      

      
      
       
       

         
       

         
       
      



    源码下载:http://file.javaxxz.com/2014/9/30/214645578.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-9 13:16 , Processed in 0.422178 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表