⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calendar.java

📁 java开发的日历, applet程序,比较好玩
💻 JAVA
字号:
package first;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicArrowButton;

/**
 * a simple calendar
 * @author zg
 * @version 1.0
 */
public class Calendar extends JApplet{

	private static final long serialVersionUID = 1L;		
	
	String dayName[] = {"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
	int leapdays[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int nonleapdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	int day = 27, month = 5, year = 2008;
	int base_year = 1900;
			
	/**
	 * 增减month, day, year, 共有6种状态
	 * @see #common_actionPerformed(ActionEvent)
	 */
	int event_type = -1;
	/**
	 * 选中month, day或year, 共有3种状态
	 * @see #setTopleft_panel()
	 */
	int date_type = -1;
	
	JFrame frame = new JFrame("Calendar");
	/**
	 *  由topleft_panel 和 topright_panel合成 
	 */
	JPanel top_panel = new JPanel();
	/**
	 *  显示时间 
	 */
	JPanel topleft_panel = new JPanel();
	/**
	 *  显示上下按钮 
	 */
	JPanel topright_panel = new JPanel();
	/**
	 *  显示减月份按钮 
	 */
	JPanel left_panel = new JPanel();
	/** 
	 * 由cenertop_panel 和 centerdown_panel 合成 
	 */
	JPanel center_panel = new JPanel();
	/**
	 *  显示星期 
	 */
	JPanel centertop_panel = new JPanel();
	/**
	 *  主面板
	 */
	JPanel centerdown_panel = new JPanel();
	/** 
	 * 显示增月份按钮 
	 */
	JPanel right_panel = new JPanel();
	/**
	 *  显示OK, cancel按钮 
	 */
	JPanel down_panel = new JPanel();
	
	JButton p_top = new BasicArrowButton(BasicArrowButton.NORTH);
	JButton n_top = new BasicArrowButton(BasicArrowButton.SOUTH);
	JButton p_month = new BasicArrowButton(BasicArrowButton.WEST);
	JButton n_month = new BasicArrowButton(BasicArrowButton.EAST);
	
	JButton j_ok = new JButton("OK");
	JButton j_cancel = new JButton("Cancel");	
	JButton j_month = new JButton("");
	JButton j_day = new JButton("");
	JButton j_year = new JButton("");
	
	JButton[] jbuttons = new JButton[6 * 7];
	/**
	 *  当前月的第一天在主面板中的起始位置 
	 */
	int adjustment;
	
	/**
	 *  双击选中日期 
	 */
	boolean isDoubleClick = false;
	/**
	 *  上次点击时间 
	 */
	long click_time = 0;
	/**
	 *  OK 或 Cancel的状态 
	 */
	int status = -1;
	
	public void init()
	{		
		try
		{
			getCurrentDate();
			createGUI();		
		}
		catch(Exception exp)
		{
			System.out.println("Exception caught in displaying calendar!");
			exp.printStackTrace();
		}
	}
	
	/**
	 * 显示选中的日期
	 */
	public void paint(Graphics g)
	{
		g.clearRect(0, 0, this.getWidth(), this.getHeight());
		g.drawString(month + "/" + day + "/" + year, this.getWidth() / 2, this.getHeight() / 2);
	}
	
	public void destroy()
	{
		System.exit(0);
	}
	
	/**
	 * 创建面板
	 *
	 */
	private void createGUI()
	{
		setTopleft_panel();	
		setTopright_panel();
		setCentertop_panel();
		setCenterdown_panel();
		setSide_panel();
		setDown_panel();
		
		try
		{
			Border border = BorderFactory.createEmptyBorder( 4, 5, 2, 5 );

			frame.getContentPane().setLayout(new BorderLayout());
			
			top_panel.setLayout(new FlowLayout());			
			top_panel.add(topleft_panel);		
			top_panel.add(topright_panel);
			top_panel.setBorder(border);
			frame.getContentPane().add(top_panel, BorderLayout.NORTH);
			
			frame.getContentPane().add(left_panel, BorderLayout.WEST);	
			
			center_panel.setLayout(new BorderLayout());
			center_panel.add(centertop_panel, BorderLayout.NORTH);
			center_panel.add(centerdown_panel, BorderLayout.SOUTH);
			center_panel.setBorder(border);
			frame.getContentPane().add(center_panel, BorderLayout.CENTER);
			
			frame.getContentPane().add(right_panel, BorderLayout.EAST);
			
			down_panel.setBorder(border);
			frame.getContentPane().add(down_panel, BorderLayout.SOUTH);
			//Display the window.
			frame.pack();
			Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
			frame.setLocation( ( screen.width - frame.getSize().width ) / 2,( screen.height - frame.getSize().height ) / 2 );
			
			frame.setVisible(true);
			frame.setResizable(false);
								
		}
		catch(Exception exp)
		{	
			System.out.println("Exceptioon caught in createAndShowGUI");
			exp.printStackTrace();
		}
	}
	
	/**
	 * 更新面板日期
	 *
	 */
	private void ReDraw()
	{				
		setTopleftText();
		setCenterdownText();
	}
	
	/**
	 * 设置左上角显示的时间
	 *
	 */
	private void setTopleftText()
	{
		String text = (month < 10) ? "0" + month : "" + month;
		j_month.setText(text);
		text = (day < 10) ? "0" + day : "" + day;
		j_day.setText(text);
		text = year + "";
		j_year.setText(text);
		
	}
	
	private void setTopleft_panel()
	{
		topleft_panel.setLayout(new FlowLayout());
		
		setTopleftText();
		
		topleft_panel.add(j_month);
		topleft_panel.add(new JLabel("-"));
		topleft_panel.add(j_day);
		topleft_panel.add(new JLabel("-"));
		topleft_panel.add(j_year);	
		
		final Color background = j_ok.getBackground();
		final Color changedground = Color.PINK;
		
		j_month.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				date_type = 0;	
				j_month.setBackground(changedground);
				j_day.setBackground(background);
				j_year.setBackground(background);
			}
		});
		
		j_day.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				date_type = 1;	
				j_month.setBackground(background);
				j_day.setBackground(changedground);				
				j_year.setBackground(background);
			}
		});
		j_year.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				date_type = 2;	
				j_month.setBackground(background);								
				j_day.setBackground(background);
				j_year.setBackground(changedground);
			}
		});
	}
		
	private void setTopright_panel()
	{
		topright_panel.setLayout(new BorderLayout());
		topright_panel.add(p_top, BorderLayout.NORTH);
		topright_panel.add(n_top, BorderLayout.SOUTH);
		
		n_top.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				switch (date_type)
				{
				case 0: // prev month
					event_type = 0;
					break;
				case 1: // prev day
					event_type = 2;
					break;
				case 2: // prev year
					event_type = 4;
					break;
				default:
					return;
				}
				common_actionPerformed(e);
			}
		});
		
		p_top.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				switch (date_type)
				{
				case 0: // next month
					event_type = 1;
					break;
				case 1: // next day
					event_type = 3;
					break;
				case 2: // next year
					event_type = 5;
					break;
				default:
					return;
				}
				common_actionPerformed(e);
			}
		});
	}
	
	private void setCentertop_panel()
	{
		centertop_panel.setLayout(new GridLayout(1,7));
		for(int d = 0; d < 7; d++)
		{
			centertop_panel.add(new JButton(dayName[d]));
		}
	}
	
	/**
	 * 设置主面板的日期
	 *
	 */
	private void setCenterdownText()
	{		
		long totaldays = no_of_days(month,year) + 1;
		long modulus = totaldays % 7;
		adjustment = (Integer.parseInt(modulus + "") + 6) % 7;
		
		int days = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];		
		for (int j = 0; j < 6 * 7 ; j++) 
		{
			if (j < adjustment)
				jbuttons[j].setText(" ");
			else if (j < adjustment + days)
				jbuttons[j].setText((j - adjustment + 1) + "");
			else
				jbuttons[j].setText(" ");
		}
	}
	
	private void setCenterdown_panel()
	{					
		centerdown_panel.setLayout(new GridLayout(6,7)); 
		
		final Color background = j_ok.getBackground();
		final Color changedground = Color.GREEN;
		
		for (int i = 0; i < 6 * 7; i++)
		{
			jbuttons[i] = new JButton(" ");
			centerdown_panel.add(jbuttons[i]);
			jbuttons[i].addActionListener(new java.awt.event.ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					String text = e.getActionCommand();
					if (text.trim().equals(""))
						return;
					int date = Integer.parseInt(text);
					int id = date + adjustment - 1;
					
					long nowTime = (new Date()).getTime();
					if (nowTime - click_time < 300)										
						isDoubleClick = true;					
					else								
						isDoubleClick = false;			
					click_time= nowTime;
					
					if (!isDoubleClick)
					{
						for (int i = 0; i < 6 * 7; i++)
						{
							jbuttons[i].setBackground(background);
						}						
						day = date;
						setTopleftText();
						jbuttons[id].setBackground(changedground);
					}
					else
					{
						status = 0;
						Output();
					}
				}
			});
		}	
		
		setCenterdownText();	
	}
		
	private void setSide_panel()
	{
		left_panel.setLayout(new FlowLayout());
		left_panel.add(p_month);
		right_panel.setLayout(new FlowLayout());
		right_panel.add(n_month);
		
		p_month.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				event_type = 0;	
				common_actionPerformed(e);
			}
		});
		
		n_month.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				event_type = 1;	
				common_actionPerformed(e);
			}
		});
	}
		
	private void setDown_panel()
	{		
		j_ok.setMnemonic('O');
		j_cancel.setMnemonic('C');
		down_panel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));
		down_panel.add(j_ok);
		down_panel.add(j_cancel);
		
		j_ok.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{								
				status = 0;
				Output();
			}
		});
		
		j_cancel.addActionListener(new java.awt.event.ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{								
				status = 1;
				Output();
			}
		});
	}	
	
	/**
	 * status 0: OK被选中
	 *		  1: Cancel被选中
	 */
	public void Output()
	{
		switch (status)
		{
		case 0:
			repaint();
			frame.dispose();
			break;
		case 1:
			frame.dispose();
			break;
		default:
			return;
		}	
	}
		
	public void common_actionPerformed(ActionEvent ae)
	{
		switch(event_type)
		{
		case 0: // prev month
		{
			if (month == 1)
			{
				month = 12;
				year--;
			}
			else
				month--;
			int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
			if (day > lastday)
				day = lastday;
			break;
		}
		case 1: // next month
		{
			if (month == 12)
			{
				month = 1;
				year++;
			}
			else
				month++;
			int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
			if (day > lastday)
				day = lastday;
			break;
		}
		case 2: // prev day
		{
			if (day == 1)
			{
				if (month - 1 == 0) // the first day of a year
				{
					day = 31;
					month = 12;
					year--;
				}
				else  // the first day of a month
				{
					month--;
					day = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
				}
			}
			else
				day--;
			break;
		}
		case 3: // next day
		{
			int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
			if (day == lastday)
			{
				if (month == 12)
				{
					day = 1;
					month = 1;
					year++;
				}
				else
				{
					month++;
					day = 1;
				}
			}
			else
				day++;
			break;
		}
		case 4: // prev year
		{
			if (year > 1900)
				year--;
			int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
			if (day > lastday)
				day = lastday;
			break;
		}
		case 5: // next year
		{
			year++;
			int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
			if (day > lastday)
				day = lastday;
			break;
		}
		default:
			return;
		}
		ReDraw();	
	}
		
	/**
	 * 初始化为当前日期
	 */
	private void getCurrentDate()
	{	
		String dateToday =new String();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date date = new Date();
		dateToday = (String)sdf.format(date);
		
		this.day = Integer.parseInt(dateToday.substring(0,2));	
		this.month = Integer.parseInt(dateToday.substring(3,5));		
		this.year = Integer.parseInt(dateToday.substring(6,10));		 
	}
	
	
	private long no_of_days(int month,int year)
	{
		int yy = (year - base_year);
		long days = (yy * 365);
		int count = 0;

		for (int i = base_year; i < year; i++)
		{
			if(checkLeap(i))
			{
				days = days + 1;
				count++;
			}
		}
		for (int j = 0; j < month - 1; j++)
		{
			if (checkLeap(year))
				days = days + leapdays[j];
			else
				days=days + nonleapdays[j];
		}
		return days;
	}
	
	
	private boolean checkLeap(int year)
	{
		if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
			return true;
		else
			return false;
	}
	
	public static void Main(String[] args)
	{
		Calendar calendar = new Calendar();
		calendar.init();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -