按照你的要求編寫的Java swing 帶界面的萬年歷代碼如下
南安網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
//日歷
import?java.awt.BorderLayout;
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.GridLayout;
import?java.awt.event.ActionEvent;
import?java.awt.event.ActionListener;
import?java.util.Calendar;
import?javax.swing.BorderFactory;
import?javax.swing.JButton;
import?javax.swing.JFrame;
import?javax.swing.JLabel;
import?javax.swing.JPanel;
public?class?CCI?extends?JFrame?implements?ActionListener{
JButton?jb1=new?JButton("");
JButton?jb2=new?JButton("");
JButton?jb3=new?JButton("");
JButton?jb4=new?JButton("");
JPanel?jp1=new?JPanel();
JPanel?jp2=new?JPanel();
JPanel?jp3=new?JPanel();
JPanel?jp4=new?JPanel();
JLabel?jl1=new?JLabel();
JLabel?jl2=new?JLabel();
JLabel[]jl=new?JLabel[49];
String?[]week={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
Calendar?c=Calendar.getInstance();
int?year,month,day;
int?nowyear,nowmonth,nowday;
CCI(){
super("簡單日歷");
nowyear=c.get(Calendar.YEAR);
nowmonth=c.get(Calendar.MONTH)+1;
nowday=c.get(Calendar.DAY_OF_MONTH);
year=nowyear;
month=nowmonth;
day=nowday;
String?s=year+"年"+month+"月";
jl1.setForeground(Color.RED);
jl1.setFont(new?Font(null,Font.BOLD,20));
jl1.setText(s);
jb1.addActionListener(this);
jb2.addActionListener(this);
jb3.addActionListener(this);
jb4.addActionListener(this);
jp1.add(jb1);jp1.add(jb2);jp1.add(jl1);jp1.add(jb3);jp1.add(jb4);
jp2.setLayout(null);
createMonthPanel();
jp2.add(jp3);
jl2.setFont(new?Font(null,Font.BOLD,20));
jl2.setText("今天是"+nowyear+"年"+nowmonth+"月"+nowday+"日");
jp4.add(jl2);
add(jp1,BorderLayout.NORTH);
add(jp2,BorderLayout.CENTER);
add(jp4,BorderLayout.SOUTH);
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
@Override
public?void?actionPerformed(ActionEvent?ae)?{
if(ae.getSource()==jb1){
year=year-1;
String?s=year+"年"+month+"月";
jl1.setText(s);
jp3.removeAll();
createMonthPanel();
jp3.validate();
}
if(ae.getSource()==jb2){
if(month==1){
year=year-1;
month=12;
}else{
month=month-1;
}
String?s=year+"年"+month+"月";
jl1.setText(s);
jp3.removeAll();
createMonthPanel();
jp3.validate();
}
if(ae.getSource()==jb3){
if(month==12){
year=year+1;
month=1;
}else{
month=month+1;
}
String?s=year+"年"+month+"月";
jl1.setText(s);
jp3.removeAll();
createMonthPanel();
jp3.validate();
}
if(ae.getSource()==jb4){
year=year+1;
String?s=year+"年"+month+"月";
jl1.setText(s);
jp3.removeAll();
createMonthPanel();
jp3.validate();
}
}
public?static?void?main(String[]?args)?{
new?CCI();
}
public?int?getMonthDays(int?year,?int?month)?{?
switch?(month)?{
case?1:?
case?3:?
case?5:?
case?7:
case?8:?
case?10:?
case?12:
return?31;?
case?2:?
if?((year%4==0year%100!=0)||year%400==0)?{?
return?29;?
}?else?{?
return?28;?
}?
default:?
return?30;?
}?
}?
public?void?createMonthPanel(){
c.set(year,?month-1,?getMonthDays(year,month));
int?weekOfMonth=c.get(Calendar.WEEK_OF_MONTH);
if(weekOfMonth==6){
jp3.setLayout(new?GridLayout(7,7));
jp3.setBounds(50,?20,?420,?350);
}else{
jp3.setLayout(new?GridLayout(6,7));
jp3.setBounds(50,?20,?420,?300);
}
jp3.setBorder(BorderFactory.createEtchedBorder());
for(int?i=0;i7;i++){
jl[i]=new?JLabel(week[i],JLabel.CENTER);
jl[i].setFont(new?Font(null,Font.BOLD,20));
jl[i].setBorder(BorderFactory.createEtchedBorder());
jp3.add(jl[i]);
}
c.set(year,?month-1,?1);
int?emptyFirst=c.get(Calendar.DAY_OF_WEEK)-1;
int?daysOfMonth=getMonthDays(year,month);
for(int?i=6+emptyFirst;i=7;i--){
int?intyear=year;
int?intmonth=month;
if(intmonth==1){
intyear=intyear-1;
intmonth=12;
}else{
intmonth=intmonth-1;
}
int?intdays=getMonthDays(intyear,intmonth);
jl[i]=new?JLabel((intdays+7-i)+"",JLabel.CENTER);
jl[i].setFont(new?Font(null,Font.BOLD,20));
jl[i].setForeground(Color.GRAY);
jl[i].setBorder(BorderFactory.createEtchedBorder());
jp3.add(jl[i]);
}
for(int?i=7+emptyFirst;idaysOfMonth+7+emptyFirst;i++){
jl[i]=new?JLabel((i-7-emptyFirst+1)+"",JLabel.CENTER);
jl[i].setFont(new?Font(null,Font.BOLD,20));
if((i+1)%7==0?||?(i+1)%7==1){
jl[i].setForeground(Color.RED);
}else?if((i-7-emptyFirst+1)==nowdaymonth==nowmonthyear==nowyear)
jl[i].setForeground(Color.BLUE);
else
jl[i].setForeground(Color.BLACK);
jl[i].setBorder(BorderFactory.createEtchedBorder());
jp3.add(jl[i]);
}
if(weekOfMonth==6)
for(int?i=48;i=daysOfMonth+emptyFirst+7;i--){
jl[i]=new?JLabel((49-i)+"",JLabel.CENTER);
jl[i].setFont(new?Font(null,Font.BOLD,20));
jl[i].setForeground(Color.GRAY);
jl[i].setBorder(BorderFactory.createEtchedBorder());
jp3.add(jl[i]);
}
else
for(int?i=41;i=daysOfMonth+emptyFirst+7;i--){
jl[i]=new?JLabel((42-i)+"",JLabel.CENTER);
jl[i].setFont(new?Font(null,Font.BOLD,20));
jl[i].setForeground(Color.GRAY);
jl[i].setBorder(BorderFactory.createEtchedBorder());
jp3.add(jl[i]);
}
}
}
/*
題目:輸出任意年份任意月份的日歷表(公元后)
思路:
1.已知1年1月1日是星期日,1?%?7?=?1?對應(yīng)的是星期日,2?%?7?=?2?對應(yīng)的是星期一,以此類推;
2.計(jì)算當(dāng)年以前所有天數(shù)+當(dāng)年當(dāng)月1號之前所有天數(shù);
a.年份分平年閏年,平年365天,閏年366天;
b.閏年的判斷方法year?%?400?==?0?||?(year?%?100?!=?0??year?%?4?==?0)若為真,則為閏年否則為平年;
c.定義平年/閏年數(shù)組,包含各月天數(shù);
d.遍歷數(shù)組求和,計(jì)算當(dāng)年當(dāng)月前總天數(shù);
e.當(dāng)年以前所有天數(shù)+當(dāng)年當(dāng)月前總天數(shù)+1即為1年1月1日到當(dāng)年當(dāng)月1日的總天數(shù);
3.總天數(shù)對7取模,根據(jù)結(jié)果判斷當(dāng)月1號是星期幾,輸出空白區(qū)域;
4.輸出當(dāng)月日歷表,逢星期六換行
*/
import?java.util.Scanner;
class?FindMonthList?{
public?static?void?main(String[]?args){
Scanner?sc?=?new?Scanner(System.in);
System.out.println("請輸入年份:");
int?year?=?sc.nextInt();????????????//年份
if?(year??1)?{????????????????????????//判斷非法輸入年份
System.out.println("輸入錯(cuò)誤!");
return;
}
System.out.println("請輸入月份:");
int?month?=?sc.nextInt();????????????//月份
if?(month??1?||?month??12)?{????????//判斷非法輸入月份
System.out.println("輸入錯(cuò)誤!");
return;
}
//輸出表頭
System.out.println("-------"?+?year?+?"?年?"?+?month?+?"?月?"?+?"-------");
System.out.println();
System.out.println("日??一??二??三??四??五??六");
//計(jì)算當(dāng)前年份以前所有天數(shù)beforeYearTotalDay;每4年一個(gè)閏年,閏年366天,平年365天
int?beforeYearTotalDay?=?((year?-?1)?/?4?*?366)?+?(year-1?-?((year?-?1)?/?4))?*?365;
int[]?arrLeapYear?=?{0,31,29,31,30,31,30,31,31,30,31,30,31};????//閏年各月天數(shù)????int數(shù)組
int[]?arrNormalYear?=?{0,31,28,31,30,31,30,31,31,30,31,30,31};????//平年各月天數(shù)????int數(shù)組
int?beforeMonthTotalDay?=?0;????????????????????????????????????//定義本年當(dāng)月之前月份的總天數(shù)
if?(year?%?400?==?0?||?(year?%?100?!=?0??year?%?4?==?0))?{????//判斷當(dāng)前年份是否是閏年
for?(int?i?=?0?;?i??month?;?i?++?)?{????//for循環(huán)計(jì)算當(dāng)月之前總天數(shù)
//計(jì)算當(dāng)前月份之前的所有天數(shù)
beforeMonthTotalDay?=?beforeMonthTotalDay?+?arrLeapYear[i];
}
//判斷當(dāng)月1日是星期幾
int?totalDay?=?beforeYearTotalDay?+?beforeMonthTotalDay?+?1;
int?week?=?totalDay?%?7;//已知1年1月1日是星期日,即模7得1對應(yīng)的是星期日
for?(int?i?=?0?;?i??(week?-?1?+?7)?%?7?;?i?++)?{????//如果寫成i??(week-1)會(huì)出現(xiàn)i-1的情況
System.out.print("????");//輸出開頭空白
}
for?(int?i?=?1?;i?=?arrLeapYear[month]?;i?++?)?{????//for循環(huán)輸出各月天數(shù)
System.out.print(i?+?"??");
if?(i??10?)?{????????//小于10的數(shù)補(bǔ)一個(gè)空格,以便打印整齊
System.out.print("?");
}
if?(i?%?7?==?((7-(week?-?1))?%?7?)?||?i?==?arrLeapYear[month])?{//每逢星期六/尾數(shù)換行
System.out.println();
}
}
}?else?{????????//不是閏年就是平年
for?(int?i?=?0?;?i??month?;?i?++?)?{????//for循環(huán)計(jì)算出當(dāng)月之前月份總天數(shù)
beforeMonthTotalDay?=?beforeMonthTotalDay?+?arrNormalYear[i];
}
//判斷當(dāng)月1日是星期幾
int?totalDay?=?beforeYearTotalDay?+?beforeMonthTotalDay?+?1;
int?week?=?totalDay?%?7;//已知1年1月1日是星期日,即模7得1對應(yīng)的是星期日
for?(int?i?=?0?;?i??(week?-?1?+?7)?%?7?;?i?++)?{????//如果寫成i??(week-1)會(huì)出現(xiàn)i-1的情況
System.out.print("????");//輸出開頭空白
}
for?(int?i?=?1?;i?=?arrNormalYear[month]?;i?++?)?{//for循環(huán)輸出各月天數(shù)
System.out.print(i?+?"??");
if?(i??10?)?{????????????//小于10的數(shù)補(bǔ)一個(gè)空格,以便打印整齊
System.out.print("?");
}
if?(i?%?7?==?((7-(week?-?1))?%?7?)?||?i?==?arrNormalYear[month])?{//每逢星期六/尾數(shù)換行
System.out.println();
}
}
}
}
}
顯示效果:
我改造了一下你的代碼 :
package?com.mikuma.calendar;
import?java.util.GregorianCalendar;
import?java.util.Scanner;
public?class?Calendar{
public?static?void?main(String[]?args){
int?year?=?0;
int?month?=?0;
Scanner?scanner?=?new?Scanner(System.in);
System.out.println("請輸入您要查詢的年份");
year?=?scanner.nextInt();
System.out.println("請輸入您要查詢的月份");
while?(true){
month?=?scanner.nextInt();
if?(month??0?||?month??12){
System.out.println("月份輸入有誤,請重新輸入");
}else{
break;
}
}
printPermanentCalendar(year,?month);
}
/**
*?輸出萬年歷
*?
*?@param?year
*?@param?month
*/
private?static?void?printPermanentCalendar(int?year,int?month){
int?days?=?0;
int?totaldays?=?0;//獲取1990年至查詢的年份的天數(shù)
for?(int?i?=?1900;?i??year;?i++){
totaldays?=?totaldays?+?(isLeapYear(i)???366?:?365);
}
int?beforedays?=?0;//到指定月份的天數(shù)
for?(int?i?=?1;?i?=?month;?i++){
switch?(i)?{
case?1:
case?3:
case?5:
case?7:
case?8:
case?10:
case?12:
days?=?31;
break;
case?4:
case?6:
case?9:
case?11:
days?=?30;
break;
case?2:
days?=?isLeapYear(year)???29?:?28;
break;
default:
break;
}
if?(i??month){
beforedays?=?beforedays?+?days;
}
}
totaldays?=?totaldays?+?beforedays;//總計(jì)天數(shù),以判斷周幾;
int?weekDay?=?0;
int?temp?=?(1?+?totaldays)?%?7;
if?(temp?==?0){//1990年1月1日星期一,據(jù)此日0天星期一,以此類推
weekDay?=?0;
}else{
weekDay?=?temp;
}
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
for?(int?i?=?0;?i??weekDay;?i++){
System.out.print("\t");
}
for?(int?i?=?1;?i?=?days;?i++){
System.out.print(i?+?"\t");
if?((totaldays?+?i)?%?7?==?6){
System.out.print("\n");
}
}
}
private?static?boolean?isLeapYear(int?year){
return?new?GregorianCalendar().isLeapYear(year);
}
}
運(yùn)行:
對比了下 360日歷:
結(jié)果正確
我們再測試下 2017 年 2月
對比 ?360 日歷
也是正確
import?java.util.Calendar;
import?java.util.Date;
import?java.util.Scanner;
public?class?MyCalendar
{
public?static?void?main(String[]?args)
{
Scanner?scanner?=?new?Scanner(System.in);
String?reg?=?"^(\\d+)[^\\d]+((0?[1-9])|(1[012]))$";
while(true)
{
System.out.println("輸入年月(年和月用非數(shù)字隔開:如2015.1)(什么都不輸入直接退出)");
String?line?=?scanner.nextLine().trim();
if("".equals(line))
{
scanner.close();
break;
}
if(!line.matches(reg))
{
continue;
}
int?year?=?Integer.parseInt(line.replaceAll(reg,?"$1"));
int?month?=?Integer.parseInt(line.replaceAll(reg,?"$2"));
System.out.println("日\t一\t二\t三\t四\t五\t六");
Calendar?calendar?=?Calendar.getInstance();
//?這個(gè)月的1號是星期幾
calendar.set(year,?month?-?1,?1);
int?day?=?calendar.get(Calendar.DAY_OF_WEEK);
int?start?=?Calendar.SUNDAY;
calendar.add(Calendar.DATE,?-day?+?start);
while(start??day)
{
System.out.print(calendar.get(Calendar.DATE)?+?"\t");
calendar.add(Calendar.DATE,?1);
start++;
}
calendar.set(year,?month?-?1,?1);
Date?now?=?calendar.getTime();
calendar.set(year,?month,?1);
Date?next?=?calendar.getTime();
for(Date?cur?=?now;?cur.before(next);)
{
calendar.setTime(cur);
int?x?=?calendar.get(Calendar.DATE);
String?tmp?=?x??10???"0"?+?x?:?x?+?"";
System.out.print(tmp?+?"\t");
if(calendar.get(Calendar.DAY_OF_WEEK)?==?Calendar.SATURDAY)
{
System.out.println();
}
calendar.add(Calendar.DATE,?1);
cur?=?calendar.getTime();
}
calendar.add(Calendar.DATE,?-1);
int?to?=?calendar.get(Calendar.DAY_OF_WEEK);
int?end?=?Calendar.SATURDAY;
while(to??end)
{
calendar.add(Calendar.DATE,?1);
int?x?=?calendar.get(Calendar.DATE);
String?tmp?=?x??10???"0"?+?x?:?x?+?"";
System.out.print(tmp?+?"\t");
to++;
}
System.out.println();
}
}
}
import java.text.SimpleDateFormat; import java.util.Calendar; public class TestDate { public static final String[] weeks = { "日", "一", "二", "三", "四", "五", "六" }; public static void main(String[] args) { Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR,2011);//2011年 c.set(Calendar.MONTH,0);//java中Calendar類,月從0開始, 0代表一月 c.set(Calendar.DATE,1);//1號 int day = c.get(Calendar.DAY_OF_WEEK);//獲致是本周的第幾天地, 1代表星期天...7代表星期六 System.out.println(new SimpleDateFormat( "yyyy-MM-dd ").format(c.getTime())); System.out.println("星期" + weeks[day-1]); } } 把以上測試代碼寫作一個(gè)方法 方法的參數(shù)名為年月日, 即可。當(dāng)然Calendar 還有很多功能,比如一周的第幾天,一年的第幾個(gè)月……