`

一个日历程序 可农历到公历 公历到农历 第几周 显示节气

J# 
阅读更多
public class Sample3 {
	private Color green = Display.getCurrent().getSystemColor(SWT.COLOR_GREEN);
	private Color white = Display.getCurrent().getSystemColor(SWT.COLOR_WHITE);
	private Color gray = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
	private Color cray = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_CYAN);
	private Color red = Display.getCurrent().getSystemColor(SWT.COLOR_RED);
	
	private Vector<CLabel> monthVector = new Vector<CLabel>(45);
	private GridData gridData;
	private GregorianCalendar calendar;
	private int todayInt;
	
	private Combo yearCombo, monthCombo;
	private Combo lunarYearCombo, lunarMonthCombo, lunarDayCombo;
	private CLabel lunarClabel, weekInYearClabel;
	private Lunar lunar;

	public static void main(String[] args) {
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("日历");
		new Sample3().createArea(shell);
		shell.pack();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}

	private void createArea(Shell shell) {
		
		shell.setLayout(new GridLayout());
//		shell.setSize(400, 400);
		
		Composite container = new Composite(shell, SWT.BORDER);
		GridLayout gridLayout = new GridLayout();
		gridLayout.numColumns = 1;	gridLayout.marginLeft = 0;	gridLayout.marginRight = 0;
		gridLayout.marginHeight = 0;	gridLayout.marginWidth = 0;	gridLayout.verticalSpacing=0;
		container.setLayout(gridLayout);
		gridData = new GridData(GridData.FILL_BOTH);
		container.setLayoutData(gridData);
		
		Composite c1 = new Composite(container, SWT.BORDER);
		gridLayout = new GridLayout();
		gridLayout.numColumns = 5;	gridLayout.marginLeft = 10;	gridLayout.marginRight = 10;
		gridLayout.marginHeight = 10;	gridLayout.marginWidth = 10;	gridLayout.verticalSpacing=0;
		gridLayout.horizontalSpacing = 1;
		c1.setLayout(gridLayout);
		gridData = new GridData(GridData.FILL_HORIZONTAL);
		c1.setLayoutData(gridData);
		createC1(c1);
		
		Composite c2 = new Composite(container, SWT.BORDER);
		gridLayout = new GridLayout();
		gridLayout.numColumns = 7;	gridLayout.marginLeft = 0;	gridLayout.marginRight = 0;
		gridLayout.marginHeight = 5;	gridLayout.marginWidth = 5;	gridLayout.verticalSpacing=0;
		c2.setLayout(gridLayout);
		gridData = new GridData(GridData.FILL_BOTH);
		c2.setLayoutData(gridData);
		createC2forTitle(c2);
		createC2forMonth(c2);
		addListen4Month();
		
		Composite c3 = new Composite(container, SWT.BORDER);
		gridLayout = new GridLayout();
		gridLayout.numColumns = 5;	gridLayout.marginLeft = 2;	gridLayout.marginRight = 2;
		gridLayout.marginHeight = 2;	gridLayout.marginWidth = 2;	gridLayout.verticalSpacing=0;
		gridLayout.horizontalSpacing = 1;
		c3.setLayout(gridLayout);
		gridData = new GridData(GridData.FILL_HORIZONTAL);
		c3.setLayoutData(gridData);
		createC3(c3);
		
		today();
	}
	private void createC3(Composite c3) {
		//weekInYearClabel
		weekInYearClabel = new CLabel(c3, SWT.CENTER | SWT.BORDER);
		gridData = new GridData();
		
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = SWT.LEFT;
		weekInYearClabel.setLayoutData(gridData);
		weekInYearClabel.setText("第几周");
		weekInYearClabel.setBackground(gray);
		
		{
			// lunar year combo
			lunarYearCombo = new Combo(c3, SWT.DROP_DOWN | SWT.READ_ONLY );
			gridData = new GridData();

			gridData.grabExcessHorizontalSpace = true;
			gridData.horizontalAlignment = SWT.RIGHT;
			lunarYearCombo.setLayoutData(gridData);
			for(int i=1900; i<=2050; i++) {
				lunarYearCombo.add(""+i);
			}
			lunarYearCombo.select(0);
			
			// lunar month combo
			String[] lunarMonthStr = {
					"正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "冬月", "腊月"
			};
			lunarMonthCombo = new Combo(c3, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.RIGHT);
			gridData = new GridData();
			// the restriction for grid. 
			gridData.grabExcessHorizontalSpace = true;
			// the process for widget in the grid.
			gridData.horizontalAlignment = SWT.LEFT;
			lunarMonthCombo.setLayoutData(gridData);
			lunarMonthCombo.setItems(lunarMonthStr);
			lunarMonthCombo.select(0);
			
			//lunar day combo
			String[] lunarDayStr = {
					"初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
					"十一","十二","十三","十四","十五","十六","十七","十八","十九","廿十",
					"廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","卅十",
			};
			lunarDayCombo = new Combo(c3, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.RIGHT);
			gridData = new GridData();
			// the restriction for grid. 
			gridData.grabExcessHorizontalSpace = true;
			// the process for widget in the grid.
			gridData.horizontalAlignment = SWT.LEFT;
			lunarDayCombo.setLayoutData(gridData);
			lunarDayCombo.setItems(lunarDayStr);
			lunarDayCombo.select(0);
			
			Button lunar2solar = new Button(c3, SWT.NONE);
			gridData = new GridData();
			// the restriction for grid. 
			gridData.grabExcessHorizontalSpace = true;
			// the process for widget in the grid.
			gridData.horizontalAlignment = SWT.LEFT;
			lunar2solar.setLayoutData(gridData);
			lunar2solar.setText("农历转公历");
			
			lunar2solar.addMouseListener(new MouseAdapter() {
				public void mouseDown(MouseEvent e) {
					int lunarYear, lunarMonth, lunarDay;
					lunarYear = Integer.parseInt(lunarYearCombo.getText());
					lunarMonth = lunarMonthCombo.getSelectionIndex() +1;
					lunarDay = lunarDayCombo.getSelectionIndex() +1;
					
					int solarYear, solarMonth, solarDay;
					String solarStr = ChineseCalendar.sCalendarLundarToSolar(lunarYear, lunarMonth, lunarDay);
					solarYear = Integer.parseInt(solarStr.substring(0, 4));
					solarMonth = Integer.parseInt(solarStr.substring(4, 6));
					solarDay = Integer.parseInt(solarStr.substring(6, 8));
					
					calendar = new GregorianCalendar();
					calendar.set(Calendar.YEAR, solarYear);
					calendar.set(Calendar.MONTH, solarMonth-1);
					calendar.set(Calendar.DAY_OF_MONTH, solarDay);
					todayInt = solarDay;
//					refresh yearCombo, monthCombo,  lunarClabel, weekInYearClabel;
					yearCombo.select(solarYear-1900);
					monthCombo.select(solarMonth-1);
					// refresh week in year
					weekInYearClabel.setText("第 "+ calendar.get(Calendar.WEEK_OF_YEAR) +" 周");
					// refresh lunarClabel
					lunar = new Lunar(calendar);
					lunarClabel.setText(lunar.toString());
					
					calendar.set(Calendar.DAY_OF_MONTH, 1);
					int firstDayWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
					
					int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
					refresh(firstDayWeek, maxDayOfMonth);
				}
			});
		}
		
	}

	private void createC1(Composite c1) {
		//years combo
		yearCombo = new Combo(c1, SWT.DROP_DOWN | SWT.READ_ONLY );
		gridData = new GridData();
		
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = SWT.LEFT;
		yearCombo.setLayoutData(gridData);
		for(int i=1900; i<=2050; i++) {
			yearCombo.add(""+i);
		}
		yearCombo.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				calendar = new GregorianCalendar();
				refreshMonth();
			}
		});
		
		//month combo
		monthCombo = new Combo(c1, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.RIGHT);
		gridData = new GridData();
		// the restriction for grid. 
		gridData.grabExcessHorizontalSpace = true;
		// the process for widget in the grid.
		gridData.horizontalAlignment = SWT.LEFT;
		monthCombo.setLayoutData(gridData);
		for(int i=1; i<=12; i++) {
			monthCombo.add(""+i);
		}
		
		monthCombo.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent event) {
				calendar = new GregorianCalendar();
				refreshMonth();
			}
		});
		
		//lunar
		lunarClabel = new CLabel(c1, SWT.CENTER | SWT.BORDER);
		gridData = new GridData();
		
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalSpan = 2;
		gridData.horizontalAlignment = SWT.RIGHT;
		lunarClabel.setLayoutData(gridData);
		lunarClabel.setText("。。。");
		lunarClabel.setBackground(gray);
		
		//today
		Button todayButton = new Button(c1, SWT.NONE | SWT.WRAP);
		gridData = new GridData();
		
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = SWT.RIGHT;
		todayButton.setLayoutData(gridData);
		todayButton.setText("今天");
		todayButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent arg0) {
				today();
			}
		});
	}

	//	text
	private void createC2forTitle(Composite c2) {
		final String WEEK[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
		for(int i=0; i<7; i++) {
			Button week = new Button(c2, SWT.NONE);
			week.setText(WEEK[i]);
			gridData = new GridData(GridData.FILL_BOTH);
			week.setLayoutData(gridData);
			week.setEnabled(false);
			week.setBackground(cray);
		}
	}

	private void createC2forMonth(Composite c2) {
		for(int i=0; i<42; i++) {
			CLabel b = new CLabel(c2, SWT.CENTER | SWT.BORDER);
			gridData = new GridData(GridData.FILL_BOTH);
			b.setLayoutData(gridData);
			b.setText("tst" +i);
			b.setBackground(white);
			if ((i+1)%7==0 || i%7==0) {
				b.setForeground(red);
			}
			monthVector.add(b);
		}
	}
	
	private void addListen4Month() {
		for(int i=0; i<42; i++) {
			final CLabel b= monthVector.elementAt(i);
			b.addMouseListener(new MouseAdapter() {
				public void mouseDown(MouseEvent e) {
					for(int i=0; i<42; i++) {
						CLabel c = monthVector.elementAt(i);
						c.setBackground(white);
					}
					b.setBackground(green);
					calendar = new GregorianCalendar();
					todayInt = Integer.parseInt(b.getText().substring(0, 2).trim());
					calendar.set(Calendar.DAY_OF_MONTH, todayInt);
					refreshMonth();
				}
			});
		}
	}
	
	private void today() {
		calendar = new GregorianCalendar();
		
		//refresh yearCombo, monthCombo,  lunarClabel, weekInYearClabel;
		int year = calendar.get(Calendar.YEAR);
		yearCombo.select(year-1900);
		int month = calendar.get(Calendar.MONTH)+1;
		monthCombo.select(month-1);
		weekInYearClabel.setText("第 "+ calendar.get(Calendar.WEEK_OF_YEAR) +" 周");
		lunar = new Lunar(calendar);
		lunarClabel.setText(lunar.toString());
		
		todayInt = calendar.get(Calendar.DAY_OF_MONTH);
		//refresh lunarYearCombo, lunarMonthCombo, lunarDayCombo;
		refreshLunarCombo(calendar);
		
		int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		int firstDayWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		
		refresh(firstDayWeek, maxDayOfMonth);
	}
	
	private void refreshLunarCombo(GregorianCalendar calendar2) {
		int year = calendar2.get(Calendar.YEAR);
		int month = calendar2.get(Calendar.MONTH)+1;
		String lunarStr = ChineseCalendar.sCalendarSolarToLundar(year, month, todayInt);
		int lyear = Integer.parseInt(lunarStr.substring(0, 4));
		int lmonth = Integer.parseInt(lunarStr.substring(4, 6));
		int lday = Integer.parseInt(lunarStr.substring(6, 8));
		lunarYearCombo.select(lyear-1900);
		lunarMonthCombo.select(lmonth-1);
		lunarDayCombo.select(lday-1);
	}

	private void refreshMonth() {
		calendar.set(Calendar.YEAR, yearCombo.getSelectionIndex() + 1900);
		calendar.set(Calendar.MONTH, monthCombo.getSelectionIndex());
		// refresh week in year
		weekInYearClabel.setText("第 "+ calendar.get(Calendar.WEEK_OF_YEAR) +" 周");
		// refresh lunarClabel
		lunar = new Lunar(calendar);
		lunarClabel.setText(lunar.toString());
		
//		refresh lunarYearCombo, lunarMonthCombo, lunarDayCombo;
		int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		todayInt = (maxDayOfMonth<todayInt)?maxDayOfMonth:todayInt;
		refreshLunarCombo(calendar);
		
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		int firstDayWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		
		refresh(firstDayWeek, maxDayOfMonth);
	}
	
	private void refresh(int firstDayWeek, int maxDayOfMonth) {
//		 clean
		for(int i=0; i<42; i++) {
			CLabel b=monthVector.elementAt(i);
			b.setText("");
			b.setBackground(white);
			b.setEnabled(false);
		}
		
		String appStr;			//
		String lunarStr;		//
		String solarTerms; 		//
		String lunarFestival;	//
		for(int i=firstDayWeek,j=1; j<=maxDayOfMonth; i++,j++) {
			calendar.set(Calendar.DAY_OF_MONTH, j);
			lunar = new Lunar(calendar);
			lunarStr = lunar.getChinaDayString();
			solarTerms = lunar.getSolarTerms();
			lunarFestival =lunar.getLunarFestival();
			
			if(lunarFestival.compareTo("") != 0) {
				appStr = lunarFestival;
			} else if (solarTerms.compareTo("") != 0) {
				appStr = solarTerms;
			} else {
				appStr = lunarStr;
			}
			
			CLabel b=monthVector.elementAt(i);
			b.setText(j +" "+ appStr);
			if (j==todayInt) {
				b.setBackground(green);
			}
			b.setEnabled(true);
		}
	}
}

 运行上面程序需要附件中的两个类(ChineseCalendar.java 和 Lunar.java)。

效果图:



 

  • lunar.zip (6.6 KB)
  • 描述: ChineseCalendar.java 和 Lunar.java
  • 下载次数: 71
  • 大小: 35.2 KB
分享到:
评论

相关推荐

    VC++ 阳历与农历转换程序,也就是公历与阴历的相互转换,部分代码是从网上找到的,重新修正了一大部分代码,大家也可以把它当作控件来使用,因为我不初就是想想这样一个程序,奉献给大家。

    本项目涉及的是一个使用VC++实现的阳历与农历转换程序,它能够进行公历(阳历)和阴历(农历)之间的相互转换。这种功能在处理中国传统节日或者需要考虑农历的日程管理软件中非常实用。 首先,我们要理解阳历和农历...

    mysql日历数据表1900-2100(公历表和农历表).rar

    它很可能包含创建和填充日历表的SQL语句,可能包括两个主要的表:一个用于公历(阳历),另一个用于农历(阴历)。这两个表可能包含以下字段: 1. **公历表**: - `id`:唯一标识每一条记录的主键。 - `year`:...

    公历农历(阳历阴历)对照表(1900年-2100年)

    公历农历(阳历阴历)对照表(1900年-2100年),客户生日提醒,各种根据身份证转换阴历生日之类的业务场景必备神器。公历农历(阳历阴历)对照表(1900年-2100年),客户生日提醒,各种根据身份证转换阴历生日之类的业务场景...

    微信小程序农历阳历日期选择器选中日期同时获取对应农/阳历日期

    本话题聚焦于如何在微信小程序中实现一个功能完善的农历阳历日期选择器,并在用户选择日期时即时获取对应的农历或阳历日期。 首先,我们需要理解农历和阳历的基本概念。阳历,又称公历,是基于地球绕太阳公转周期...

    小程序日历组件,可显示农历!休假补班!自定义提醒

    本文将详细解析如何在小程序中实现一个具备农历显示、休假补班功能以及自定义提醒的日历组件。 一、日历组件基础 1. 日历组件结构:日历组件通常由一个月的日历视图构成,每个日期格子可以包含日期数字、星期以及...

    Android 日历完整(公历、农历、节假日、节气)demo源码

    在Android开发中,日历功能是一项常见的需求,它不仅涉及到公历日期的处理,还可能需要展示农历信息、国内外节假日以及中国传统节气。本篇将深入解析“Android 日历完整(公历、农历、节假日、节气)demo源码”的...

    mysql日历数据(包括公历表和农历表,1900-2100年)

    在本案例中,我们关注的是一个特殊的数据库设计,涉及到1900年至2100年的日历数据,涵盖了公历和农历两个方面。这个数据库设计对于需要处理中国传统节日或者需要同时显示公历和农历日期的系统特别有用。 首先,我们...

    java阳历转农历

    Java阳历转农历类可以将公历日期转换为农历日期,提供了一个便捷的方式来获取农历日期。 在 Java 中,实现阳历转农历需要使用到 Calendar 和 Date 类。Calendar 类提供了一个抽象的日历模型,可以用来计算日期的年...

    C语言实现农历万年历,农历公历转换--最新版

    信息最全的农历万年历,可以计算1901-2300年的信息,有整齐美观的日历格式打印。 公历信息包括日期、星期、节日。 农历信息包括二十四节气时间点、闰月、大小月、三伏、九九、干支、年号、农历节假日、属相等。 还...

    delphi 带有24节气的日历、农历、节日

    在本文中,我们将深入探讨如何在Delphi编程环境中创建一个集成24节气、日历以及农历功能的应用程序。Delphi是一种强大的Object Pascal编程工具,它提供了丰富的组件库和强大的功能,使得开发这类应用程序变得相对...

    android本地日历可以实现阴阳历显示农历节气天气查询,

    在Android平台上,开发一款本地日历应用,可以提供丰富的功能,包括阴阳历显示、农历节气查询、天气信息获取以及一些特色服务如称骨算命和阴阳历转换等。这样的应用能够满足用户对于传统与现代日历功能的需求,提供...

    java写的日历,有公历农历对照,一个公历对应一个农历,有日地图

    Java编写的日历系统是一个强大的工具,它集成了公历与农历的转换和对照功能,为用户提供了一种方便的方式来查看和管理日期。这个系统的核心在于它能够准确地将公历日期映射到对应的农历日期,这在许多文化中,尤其是...

    C#.NET桌面日历时钟程序,带农历,节气(含控件源代码)

    一个日历程序,可以转换农历,显示节气。还带有圆形的时钟。资源包含了农历节气算法和时钟控件源代码。

    QT实现农历转换(C++)

    我们可以创建一个应用程序,让用户输入公历日期,然后通过后台计算显示出对应的农历日期、节气、干支信息和相关的传统节日。为了实现这些功能,我们需要编写以下类: 1. `LunarConverter`:这个类将包含农历和公历...

    java 万年历(农历和阳历的互换)

    在Java编程语言中,开发一个万年历系统,特别是涉及到农历和阳历的转换,是一项具有挑战性的任务。农历和阳历是两种不同的日期表示方式,理解和实现它们之间的转换需要深入理解日期计算的原理和算法。 阳历,也称为...

    C#阳历农历日历类CNDateHelper.zip

    C#阳历农历日历类 农历属性 农历年 农历月份 农历天 农历年(支干) 农历月份(字符) 农历天(字符) 农历属象 二十四节气 阴历节日 阳历节日 公历转农历 传回农历y年的总天数 传回农历y年闰月的天数 传回农历y年闰哪个月...

    公历与农历互转 纯DELPHI代码 支持0-9999年

    标题中的“公历与农历互转 纯DELPHI代码 支持0-9999年”表明,我们关注的是一个使用DELPHI编写的程序,它可以处理公元前1年至公元9999年之间的日期转换。DELPHI是一种强大的面向对象的编程语言,以其高效和灵活性而...

    Java万年历包含公历农历星期二十四节气

    Java万年历是一款功能丰富的日历应用,专为程序员和普通用户设计,提供从1800年至2100年间的日期展示,涵盖了公历、农历、星期以及二十四节气等多种时间信息。这款程序的核心在于其强大的日期计算和转换算法,能够...

    oracle日历转化成农历

    Oracle数据库系统提供了强大的日期处理功能,其中包括将公历(阳历)日期转换为农历日期。在Oracle中,虽然没有内置的直接转换函数来实现这一功能,但可以通过自定义函数或者利用现有的开源存储过程来实现这一转换。...

Global site tag (gtag.js) - Google Analytics