日历类, 提供日历功能

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>”);
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; i6){
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_

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部