/*
創(chuàng)新互聯(lián)專注于冷水灘企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),購物商城網(wǎng)站建設(shè)。冷水灘網(wǎng)站建設(shè)公司,為冷水灘等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計,全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
題目:輸出任意年份任意月份的日歷表(公元后)
思路:
1.已知1年1月1日是星期日,1?%?7?=?1?對應(yīng)的是星期日,2?%?7?=?2?對應(yīng)的是星期一,以此類推;
2.計算當(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ù)組求和,計算當(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("輸入錯誤!");
return;
}
System.out.println("請輸入月份:");
int?month?=?sc.nextInt();????????????//月份
if?(month??1?||?month??12)?{????????//判斷非法輸入月份
System.out.println("輸入錯誤!");
return;
}
//輸出表頭
System.out.println("-------"?+?year?+?"?年?"?+?month?+?"?月?"?+?"-------");
System.out.println();
System.out.println("日??一??二??三??四??五??六");
//計算當(dāng)前年份以前所有天數(shù)beforeYearTotalDay;每4年一個閏年,閏年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)計算當(dāng)月之前總天數(shù)
//計算當(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)會出現(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ǔ)一個空格,以便打印整齊
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)計算出當(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)會出現(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ǔ)一個空格,以便打印整齊
System.out.print("?");
}
if?(i?%?7?==?((7-(week?-?1))?%?7?)?||?i?==?arrNormalYear[month])?{//每逢星期六/尾數(shù)換行
System.out.println();
}
}
}
}
}
顯示效果:
按照你的要求編寫的Java swing 帶界面的萬年歷代碼如下
//日歷
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]);
}
}
}
先上張效果圖:以下是實(shí)現(xiàn)代碼:/*日歷*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.regex.Pattern;
import javax.swing.*;
public class Demo28 extends JFrame {
int m = 1;
String[] monthchoose = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
"11", "12" }; // 存放月份的字符數(shù)組
String[] columnNames = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; // 存放星期的字符數(shù)組
Calendar ca = Calendar.getInstance();
Container contentPane = getContentPane();
VectorString vector = new VectorString();
String[][] date = new String[6][7]; // 表格的顯示數(shù)據(jù)的格式
TextField tf; // 文本框的值代表的是年份
JComboBox jb;
JTable table; // 把日期用table的方式顯示出來
public void getDate(String year, String month, String week, int Max_Day) {
int n = 0, b = 0;
// 動態(tài)把傳進(jìn)來月份的天數(shù)存放到容器里
for (int j = 1; j = Max_Day; j++) {
vector.add(String.valueOf(j));
}
//每次往table里添加數(shù)據(jù)的時候,都預(yù)先把原table里 的 數(shù)據(jù)清空
for(int x = 0;xdate.length;x++){
for(int y = 0;ydate[x].length;y++){
date[x][y] = null;
}
}
// 根據(jù)傳進(jìn)來月份的第一天是星期幾,來構(gòu)建Table
for (int a = Integer.parseInt(week) - 1; a date[0].length; a++) {
date[0][a] = new String((String) vector.toArray()[n]);
n++;
}
for (int i = 1; i date.length; i++) {
for (int j = 0; j date[i].length; j++) {
if (n vector.size()) {
date[i][j] = new String((String) vector.toArray()[n]);
n++;
} else
break;
}
}
// 把容器里的數(shù)據(jù)全部清除,以備下次再存放新的數(shù)據(jù)
while (b vector.size()) {
vector.remove(b);
}
}
public void chooseDate(String day) {
JLabel label = new JLabel();
for (int y = 0; y date.length; y++) {
for (int z = 0; z date[y].length; z++) {
System.out.print(date[y][z] + " ");
System.out.println(day);
if (date[y][z] != null) {
if (date[y][z].equals(day)) {
table.setSelectionBackground(Color.yellow);
return;
}
}
}
}
}
public void paint() {
setTitle("日歷");
setBounds(200, 200, 350, 178);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
int m = 0;
String year = String.valueOf(ca.get(Calendar.YEAR)); // 得到當(dāng)前的系統(tǒng)時間的年份,并把這個數(shù)值存放到y(tǒng)ear這個變量里
String month = String.valueOf(ca.get(Calendar.MONTH) + 1); // 得到當(dāng)前的系統(tǒng)時間的月份,并把這個數(shù)值存放到month這個變量里
String day = String.valueOf(ca.get(Calendar.DATE)); // 得到當(dāng)前的系統(tǒng)時間的日期,并把這個數(shù)值存放到day這個變量里
ca.set(Calendar.DATE, 1); // 把Calendar 對象的DATA設(shè)置為1
String week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根據(jù)設(shè)置的Calendar對象,計算出這個月第一天是星期幾
int Max_Day = ca.getActualMaximum(Calendar.DATE); // 得到當(dāng)前系統(tǒng)時間月份有多少天
getDate(year, month, week, Max_Day);
// 從月份數(shù)組里取出與當(dāng)前系統(tǒng)時間一樣的月份值
for (int i = 0; i monthchoose.length; i++) {
if (monthchoose[i].equals(month)) {
m = i;
}
}
JToolBar toolBar = new JToolBar();
JButton b1 = new JButton("<");
b1.addMouseListener(new myMouseListener1());
JButton b2 = new JButton(">");
b2.addMouseListener(new myMouseListener2());
JLabel j1 = new JLabel("年");
JLabel j2 = new JLabel("月");
tf = new TextField(5);
tf.addKeyListener(new myKeyListener());
tf.setText(year);
jb = new JComboBox(monthchoose);
jb.setSelectedIndex(m);
jb.addActionListener(new myActionListener3());
table = new JTable(date, columnNames);
//table.addMouseListener(new tableMouseListener());
table.setPreferredScrollableViewportSize(new Dimension(350, 150));
JScrollPane jsp = new JScrollPane(table);
contentPane.add(jsp, BorderLayout.CENTER);
chooseDate(day);
toolBar.add(b1);
toolBar.add(tf);
toolBar.add(b2);
toolBar.add(j1);
toolBar.add(jb);
toolBar.add(j2);
toolBar.setLocation(0, 0);
toolBar.setSize(400, 15);
contentPane.add(toolBar, BorderLayout.NORTH);
setVisible(true);
new Thread(new PaintThread()).start(); // 調(diào)用內(nèi)部類PaintThread,根據(jù)里面的設(shè)置來重畫
}
public static void main(String[] args) {
Demo28 d28 = new Demo28();
d28.paint();
}
// 鼠標(biāo)單擊左邊按鈕觸發(fā)的事件
class myMouseListener1 extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
String str = tf.getText().trim(); // 得到文本框的值
int i = Integer.parseInt(str);
i = i - 1;
tf.setText(String.valueOf(i));
String new_year = String.valueOf(i); // 把表示年份的文本框的值存放到變量new_year里
ca.set(Calendar.YEAR, i); // 把Calendar 對象的YEAR設(shè)置為用戶設(shè)置的年份
String new_month = (String) jb.getSelectedItem(); // 得到月份值
ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar對象的MONTH設(shè)置為用戶設(shè)置的月份
ca.set(Calendar.DATE, 1); // 把Calendar 對象的DATA設(shè)置為1
String new_week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根據(jù)設(shè)置的Calendar對象,計算出這個月第一天是星期幾
int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根據(jù)設(shè)置后的Calendar對象計算這個月份有多少天
getDate(new_year, new_month, new_week, Max_Day);
}
}
class myKeyListener extends KeyAdapter {
public void keyReleased(KeyEvent e) {
try {
int i = Integer.parseInt(tf.getText().trim());
int key = e.getKeyCode();
if (key == KeyEvent.VK_ENTER) {
String new_year = String.valueOf(i);
ca.set(Calendar.YEAR, i); // 把Calendar對象的YEAR設(shè)置為用戶設(shè)置的年份
String new_month = (String) jb.getSelectedItem(); // 得到月份值
ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar對象的MONTH設(shè)置為用戶設(shè)置的月份
ca.set(Calendar.DATE, 1); // 把Calendar 對象的DATA設(shè)置為1
String new_week = String.valueOf(ca
.get(Calendar.DAY_OF_WEEK)); // 根據(jù)設(shè)置的Calendar對象,計算出這個月第一天是星期幾
int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根據(jù)設(shè)置后的Calendar對象計算這個月份有多少天
getDate(new_year, new_month, new_week, Max_Day);
}
} catch (NumberFormatException excption) {
System.out.println("你輸入的年份不正確!");
}
}
}
// 鼠標(biāo)單擊右邊按鈕觸發(fā)的事件
class myMouseListener2 extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
String str = tf.getText().trim();
int i = Integer.parseInt(str);
i = i + 1;
tf.setText(String.valueOf(i));
String new_year = String.valueOf(i); // 把表示年份的文本框的值存放到變量new_year里
ca.set(Calendar.YEAR, i); // 把Calendar 對象的YEAR設(shè)置為用戶設(shè)置的年份
String new_month = (String) jb.getSelectedItem(); // 得到月份值
ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar對象的MONTH設(shè)置為用戶設(shè)置的月份
ca.set(Calendar.DATE, 1); // 把Calendar 對象的DATA設(shè)置為1
String new_week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根據(jù)設(shè)置的Calendar對象,計算出這個月第一天是星期幾
int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根據(jù)設(shè)置后的Calendar對象計算這個月份有多少天
getDate(new_year, new_month, new_week, Max_Day);
}
}
// 鼠標(biāo)單擊選擇框觸發(fā)的事件
class myActionListener3 implements ActionListener {
public void actionPerformed(ActionEvent e) {
String new_year = String.valueOf(ca.get(Calendar.YEAR)); // 把表示年份的文本框的值存放到變量new_year里
String new_month = (String) jb.getSelectedItem(); // 得到用戶設(shè)置的月份
ca.set(Calendar.MONTH, Integer.parseInt(new_month) - 1); // 把Calendar對象的月份值設(shè)置為用戶定義的月份
ca.set(Calendar.DATE, 1); // 把Calendar 對象的DATA設(shè)置為1
String new_week = String.valueOf(ca.get(Calendar.DAY_OF_WEEK)); // 根據(jù)設(shè)置的Calendar對象,計算出這個月第一天是星期幾
int Max_Day = ca.getActualMaximum(Calendar.DATE); // 根據(jù)設(shè)置后的Calendar對象計算這個月份有多少天
getDate(new_year, new_month, new_week, Max_Day);
}
}
// 重畫組件
private class PaintThread implements Runnable {
public void run() {
while (true) {
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}