您现在的位置: 启天网 >> 技术中心 >> Java >> 正文
今天是:
[图文]java做的一个日历程序            【字体:
java做的一个日历程序
作者:未知    文章来源:本站整理    点击数:    更新时间:2007-3-26

程序运行图:

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[i],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();
  }
}

下载源代码

文章录入:junsan    责任编辑:junsan 
  • 上一篇文章:
  • 下一篇文章:
  • 最新热点 最新推荐 相关文章
    Java中不要裸写代码
    Java多线程杂谈
    两个变量交换的三种方法
    网站登录记忆跳转jsp实现的一种方法
    策略模式及实现
    IIS+tomcat整合,并且通过域名访问网站
    Java实现按字节长度截取字符串
    Java多线程技术中所有方法的详细解析
    JAVA中的接口和抽象类(加深初学者理解)
    Java开发者需坚守的十大基本准则
     网友评论:(最新10条。只代表网友观点,与本站立场无关!)