java编写日历

Python030

java编写日历,第1张

我给你贴上我在java核心技术中看到的代码吧,当然没有输入年份和月份,是按照当前时间创建的,写有我写的注释,应该能看的懂

/*

* 2012年5月13日10:37:58

* 日历程序

* Function:

* 显示当前月份的日历

* 总结

* 1. 0-11分别代表1-12月

* 1-7分别代表周日-周六

* 2. 使用GregorianCalendar对象的get方法(参数)获取月,日,年等信息

* 3.

*/

import java.text.DateFormatSymbols

import java.util.*

public class CalendarTest {

public static void main(String[] args) {

//construct d as current date构造一个日期

GregorianCalendar d = new GregorianCalendar()

//获取今天是这个月的第几天

int today = d.get(Calendar.DAY_OF_MONTH) //Calendar.DAY_OF_MONTH作为参数调用,得到今天是这个月的第几天

int month = d.get(Calendar.MONTH) //月份

d.set(Calendar.DAY_OF_MONTH, 1) //设置d的日期是本月的1号

int weekDay = d.get(Calendar.DAY_OF_WEEK) //获取当天位于本星期的第几天,也就确定了星期几,值的范围是1-7

int firstDayOfWeek = d.getFirstDayOfWeek() //获取一星期的第一天,我们得到的是Calendar.SUNDAY,因为我们一星期的第一天是周日

int indent = 0 //为了定位本月第一天,定义索引

while (weekDay != firstDayOfWeek) {

//注意,月份用0-11代表1-12月,为了清晰起见,使用常量代替,下面获取月份得到的实际是当前月-1的值,所以我们要加1

//System.out.printf("当前星期的第%d天,位于当月的第%d天, 现在是%d月\n",

//weekDay, d.get(Calendar.DAY_OF_MONTH), d.get(Calendar.MONTH)+1) //Test Code

indent++//缩进个数+1

d.add(Calendar.DAY_OF_MONTH, -1)//当前天数-1,如果现在是1号,则执行本条代码后,时间变为上一个月最后一天

weekDay = d.get(Calendar.DAY_OF_WEEK) //重新获取当天位于本星期的第几天

}

String[] weekDayNames = new DateFormatSymbols().getShortWeekdays()//获取简短形式的星期字符串数组

//System.out.println(weekDayNames.length)getShortWeekdays()得到的数组的长度是8,下标为0的是没有值1为星期日...7为星期六

//注释代码1

//Java核心技术的代码

/*

do {

//System.out.printf("%4s", weekDayNames[weekDay]) //经过上面定义索引,weekDay代表的是本星期日

d.add(Calendar.DAY_OF_MONTH, 1) //天数加1

weekDay = d.get(Calendar.DAY_OF_WEEK) //重新获得weekDay的值

} while (weekDay != firstDayOfWeek) //当循环完一个星期后,这里判断不成立,退出循环

*/

//我写的代码,替换上面注释代码1

for (int i=1i<weekDayNames.lengthi++)//打印星期标题

System.out.printf("%3s\t", weekDayNames[i])//引号内是一个全角的空格,因为是中文版,不是书上英文环境,中文和空格对于不上,这里我们用\t解决

//System.out.printf("%3s ", weekDayNames[i]) //方式2

System.out.println()//换行

for (int i=1i<=indenti++)//确定一星期的一天位置,利用上面indent

System.out.printf("\t")//如用方式2,则这里内容是四个全角空格

//实现输出日期

d.set(Calendar.MONTH, month)

d.set(Calendar.DAY_OF_MONTH, 1)

do {

//print day

int day = d.get(Calendar.DAY_OF_MONTH)

System.out.printf("%3d", day)

if (day == today)

System.out.print("*")

System.out.print("\t")

d.add(Calendar.DATE, 1)//天数加1

weekDay = d.get(Calendar.DAY_OF_WEEK)//刷新weekDay

if (weekDay == firstDayOfWeek) //如果这天等于星期天则换行

System.out.println()

} while (d.get(Calendar.MONTH) == month)

}

}

写了个简明的,

import java.util.Calendar

import java.util.Scanner

public class Test {

static public void main(String 参数[]){

Calendar c = Calendar.getInstance()

Scanner sc = new Scanner(System.in)

System.out.println("请输入年份:")

int year= sc.nextInt()

c.set(Calendar.YEAR, year)

c.set(Calendar.MONTH, Calendar.JANUARY)

c.set(Calendar.DAY_OF_MONTH, 1)

while(c.get(Calendar.YEAR)==year){

int wday=c.get(Calendar.DAY_OF_WEEK)

int mday=c.get(Calendar.DAY_OF_MONTH)

if(mday==1){

System.out.println("\n日\t一\t二\t三\t四\t五\t六\t第"+(c.get(Calendar.MONTH)+1)+"月")

System.out.println("---------------------------------------------------")

for(int i=0i<wday-1i++) System.out.print(" \t")

}

System.out.print(mday+"\t")

if(wday==7) System.out.println()

c.add(Calendar.DAY_OF_YEAR, 1)

}

}

}

=======

请输入年份:

2012

日 一 二 三 四 五 六 第1月

---------------------------------------------------

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

29 30 31

日 一 二 三 四 五 六 第2月

---------------------------------------------------

1 2 3 4

5 6 7 8 9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29

日 一 二 三 四 五 六 第3月

---------------------------------------------------

1 2 3

4 5 6 7 8 9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30 31

日 一 二 三 四 五 六 第4月

---------------------------------------------------

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

29 30

日 一 二 三 四 五 六 第5月

---------------------------------------------------

1 2 3 4 5

6 7 8 9 10 11 12

13 14 15 16 17 18 19

20 21 22 23 24 25 26

27 28 29 30 31

日 一 二 三 四 五 六 第6月

---------------------------------------------------

1 2

3 4 5 6 7 8 9

10 11 12 13 14 15 16

17 18 19 20 21 22 23

24 25 26 27 28 29 30

日 一 二 三 四 五 六 第7月

---------------------------------------------------

1 2 3 4 5 6 7

8 9 10 11 12 13 14

15 16 17 18 19 20 21

22 23 24 25 26 27 28

29 30 31

日 一 二 三 四 五 六 第8月

---------------------------------------------------

1 2 3 4

5 6 7 8 9 10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29 30 31

日 一 二 三 四 五 六 第9月

---------------------------------------------------

1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30

日 一 二 三 四 五 六 第10月

---------------------------------------------------

1 2 3 4 5 6

7 8 9 10 11 12 13

14 15 16 17 18 19 20

21 22 23 24 25 26 27

28 29 30 31

日 一 二 三 四 五 六 第11月

---------------------------------------------------

1 2 3

4 5 6 7 8 9 10

11 12 13 14 15 16 17

18 19 20 21 22 23 24

25 26 27 28 29 30

日 一 二 三 四 五 六 第12月

---------------------------------------------------

1

2 3 4 5 6 7 8

9 10 11 12 13 14 15

16 17 18 19 20 21 22

23 24 25 26 27 28 29

30 31

import java.awt.BorderLayout

import java.awt.Color

import java.awt.Dimension

import java.awt.GridLayout

import java.awt.SystemColor

import java.awt.event.ActionEvent

import java.awt.event.KeyEvent

import java.awt.event.MouseEvent

import java.util.Calendar

import java.util.GregorianCalendar

import java.util.Locale

import java.util.Date

import java.util.StringTokenizer

import javax.swing.BorderFactory

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JPanel

import javax.swing.JTextField

import javax.swing.JToggleButton

import javax.swing.SwingConstants

import javax.swing.UIManager

/**

* <p>Title: Swing日历</p>

* <p>Description: 操作日期</p>

* @author duxu2004

* @version 1.0.1

*/

class JCalendar extends JPanel{

//动态表示年月日

private int year=0

private int month=0

private int day=0

//主面板

private JPanel Main = new JPanel()

//日面板

private JPanel jPanelDay = new JPanel()

//月面板

private JPanel jPanelMonth = new JPanel()

//年的输入位置

private JTextField Year = new JTextField()

//月的输入位置

private JTextField Month = new JTextField()

//减少月份

private JButton MonthDown = new JButton()

//增加月份

private JButton MonthUp = new JButton()

private JPanel jPanelButton = new JPanel()

//减少年份

private JButton YearDown = new JButton()

//增加年份

private JButton YearUp = new JButton()

//显示日期的位置

private JLabel Out = new JLabel()

//中国时区,以后可以从这里扩展可以设置时区的功能

private Locale l=Locale.CHINESE

//主日历

private GregorianCalendar cal=new GregorianCalendar(l)

//星期面板

private JPanel weekPanel=new JPanel()

//天按钮组

private JToggleButton[] days=new JToggleButton[42]

//天面板

private JPanel Days = new JPanel()

//标示

private JLabel jLabel1 = new JLabel()

private JLabel jLabel2 = new JLabel()

private JLabel jLabel3 = new JLabel()

private JLabel jLabel4 = new JLabel()

private JLabel jLabel5 = new JLabel()

private JLabel jLabel6 = new JLabel()

private JLabel jLabel7 = new JLabel()

//当前选择的天数按钮

private JToggleButton cur=null

//月份天数数组,用来取得当月有多少天

// 1 2 3 4 5 6 7 8 9 10 11 12

private int[] mm={31,28,31,30,31,30,31,31,30,31,30,31}

//空日期构造函数

public JCalendar() {

try {

jbInit()

}

catch(Exception e) {

e.printStackTrace()

}

}

//带日期设置的构造函数

public JCalendar(int year, int month, int day) {

cal.set(year, month, day)

try {

jbInit()

}

catch (Exception e) {

e.printStackTrace()

}

}

//带日历输入的构造函数

public JCalendar(GregorianCalendar calendar) {

cal=calendar

try {

jbInit()

}

catch (Exception e) {

e.printStackTrace()

}

}

//带日期输入的构造函数

public JCalendar(Date date) {

cal.setTime(date)

try {

jbInit()

}

catch (Exception e) {

e.printStackTrace()

}

}

//初始化组件

private void jbInit() throws Exception {

//初始化年、月、日

iniCalender()

this.setLayout(new BorderLayout())

this.setBorder(BorderFactory.createRaisedBevelBorder())

this.setMaximumSize(new Dimension(200, 200))

this.setMinimumSize(new Dimension(200, 200))

this.setPreferredSize(new Dimension(200, 200))

Main.setLayout(new BorderLayout())

Main.setBackground(SystemColor.info)

Main.setBorder(null)

Out.setBackground(Color.lightGray)

Out.setHorizontalAlignment(SwingConstants.CENTER)

Out.setMaximumSize(new Dimension(100, 19))

Out.setMinimumSize(new Dimension(100, 19))

Out.setPreferredSize(new Dimension(100, 19))

jLabel1.setForeground(Color.red)

jLabel1.setHorizontalAlignment(SwingConstants.CENTER)

jLabel1.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel1.setText("日")

jLabel2.setForeground(Color.blue)

jLabel2.setHorizontalAlignment(SwingConstants.CENTER)

jLabel2.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel2.setText("六")

jLabel3.setHorizontalAlignment(SwingConstants.CENTER)

jLabel3.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel3.setText("五")

jLabel4.setHorizontalAlignment(SwingConstants.CENTER)

jLabel4.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel4.setText("四")

jLabel5.setHorizontalAlignment(SwingConstants.CENTER)

jLabel5.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel5.setText("三")

jLabel6.setBorder(null)

jLabel6.setHorizontalAlignment(SwingConstants.CENTER)

jLabel6.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel6.setText("二")

jLabel7.setBackground(Color.lightGray)

jLabel7.setForeground(Color.black)

jLabel7.setBorder(null)

jLabel7.setHorizontalAlignment(SwingConstants.CENTER)

jLabel7.setHorizontalTextPosition(SwingConstants.CENTER)

jLabel7.setText("一")

weekPanel.setBackground(UIManager.getColor("InternalFrame.activeTitleGradient"))

weekPanel.setBorder(BorderFactory.createEtchedBorder())

weekPanel.setLayout(new GridLayout(1,7))

weekPanel.add(jLabel1, null)

weekPanel.add(jLabel7, null)

weekPanel.add(jLabel6, null)

weekPanel.add(jLabel5, null)

weekPanel.add(jLabel4, null)

weekPanel.add(jLabel3, null)

weekPanel.add(jLabel2, null)

MonthUp.setAlignmentX((float) 0.0)

MonthUp.setActionMap(null)

jPanelMonth.setBackground(SystemColor.info)

jPanelMonth.setLayout(new BorderLayout())

jPanelMonth.setBorder(BorderFactory.createEtchedBorder())

Month.setBorder(null)

Month.setHorizontalAlignment(SwingConstants.CENTER)

Month.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(MouseEvent e) {

Month_mouseClicked(e)

}

})

Month.addKeyListener(new java.awt.event.KeyAdapter() {

public void keyPressed(KeyEvent e) {

Month_keyPressed(e)

}

})

MonthDown.setBorder(null)

MonthDown.setText("\u25C4")

MonthDown.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

MonthDown_actionPerformed(e)

}

})

MonthUp.setBorder(null)

MonthUp.setText("\u25BA")

MonthUp.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

MonthUp_actionPerformed(e)

}

})

jPanelButton.setLayout(null)

jPanelButton.setBorder(null)

jPanelButton.addComponentListener(new java.awt.event.ComponentAdapter() {

public void componentResized(java.awt.event.ComponentEvent evt) {

jPanelButtonComponentResized(evt)

}

})

Year.setBorder(BorderFactory.createEtchedBorder())

Year.setMaximumSize(new Dimension(80, 25))

Year.setMinimumSize(new Dimension(80, 25))

Year.setPreferredSize(new Dimension(80, 25))

Year.setHorizontalAlignment(SwingConstants.CENTER)

Year.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(MouseEvent e) {

Year_mouseClicked(e)

}

})

Year.addKeyListener(new java.awt.event.KeyAdapter() {

public void keyPressed(KeyEvent e) {

Year_keyPressed(e)

}

})

YearDown.setBorder(null)

YearDown.setMaximumSize(new Dimension(16, 16))

YearDown.setMinimumSize(new Dimension(16, 16))

YearDown.setPreferredSize(new Dimension(16, 16))

YearDown.setSize(new Dimension(16, 16))

YearDown.setText("▼")

YearDown.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

YearDown_actionPerformed(e)

}

})

YearUp.setBorder(null)

YearUp.setMaximumSize(new Dimension(16, 16))

YearUp.setMinimumSize(new Dimension(16, 16))

YearUp.setPreferredSize(new Dimension(16, 16))

YearUp.setSize(new Dimension(16, 16))

YearUp.setText("▲")

YearUp.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

YearUp_actionPerformed(e)

}

})

jPanelDay.setLayout(new BorderLayout())

Days.setLayout(new GridLayout(6,7))

Days.setBackground(SystemColor.info)

for(int i=0i<42i++){

days[i]=new JToggleButton()

days[i].setBorder(null)

days[i].setBackground(SystemColor.info)

days[i].setHorizontalAlignment(SwingConstants.CENTER)

days[i].setHorizontalTextPosition(SwingConstants.CENTER)

//days[i].setSize(l,l)

days[i].addActionListener(new java.awt.event.ActionListener(){

public void actionPerformed(ActionEvent e) {

day=Integer.parseInt(((JToggleButton)e.getSource()).getText())

showDate()

showDays()

}

})

Days.add(days[i])

}

this.add(Main, BorderLayout.NORTH)

this.add(jPanelDay, BorderLayout.CENTER)

this.add(jPanelMonth, BorderLayout.SOUTH)

Main.add(Year, BorderLayout.CENTER)

Main.add(Out, BorderLayout.WEST)

Main.add(jPanelButton, BorderLayout.EAST)

jPanelButton.add(YearUp)

jPanelButton.add(YearDown)

jPanelDay.add(weekPanel,BorderLayout.NORTH)

jPanelDay.add(Days, BorderLayout.CENTER)

jPanelMonth.add(Month, BorderLayout.CENTER)

jPanelMonth.add(MonthDown, BorderLayout.WEST)

jPanelMonth.add(MonthUp, BorderLayout.EAST)

showMonth()

showYear()

showDate()

showDays()

}

//自定义重画年选择面板

void jPanelButtonComponentResized(java.awt.event.ComponentEvent evt){

YearUp.setLocation(0,0)

YearDown.setLocation(0,YearUp.getHeight())

jPanelButton.setSize(YearUp.getWidth(),YearUp.getHeight()*2)

jPanelButton.setPreferredSize(new Dimension(YearUp.getWidth(),YearUp.getHeight()*2))

jPanelButton.updateUI()

}

//测试用

public static void main(String[] args){

JFrame f=new JFrame()

f.setContentPane(new JCalendar())

f.pack()

//f.setResizable(false)

f.show()

}

//增加年份

void YearUp_actionPerformed(ActionEvent e) {

year++

showYear()

showDate()

showDays()

}

//减少年份

void YearDown_actionPerformed(ActionEvent e) {

year--

showYear()

showDate()

showDays()

}

//减少月份

void MonthDown_actionPerformed(ActionEvent e) {

month--

if(month<0) {

month = 11

year--

showYear()

}

showMonth()

showDate()

showDays()

}

//增加月份

void MonthUp_actionPerformed(ActionEvent e) {

month++

if(month==12) {

month=0

year++

showYear()

}

showMonth()

showDate()

showDays()

}

//初始化年月日

void iniCalender(){

year=cal.get(Calendar.YEAR)

month=cal.get(Calendar.MONTH)

day=cal.get(Calendar.DAY_OF_MONTH)

}

//刷新月份

void showMonth(){

Month.setText(Integer.toString(month+1)+"月")

}

//刷新年份

void showYear(){

Year.setText(Integer.toString(year)+"年")

}

//刷新日期

void showDate(){

Out.setText(Integer.toString(year)+"-"+Integer.toString(month+1)+"-"+Integer.toString(day))

}

//重画天数选择面板

void showDays() {

cal.set(year,month,1)

int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK)

int n=mm[month]

if(cal.isLeapYear(year)&&month==1) n++

int i=0

for(i<firstDayOfWeek-1i++){

days[i].setEnabled(false)

days[i].setSelected(false)

days[i].setText("")

}

int d=1

for(d<=nd++){

days[i].setText(Integer.toString(d))

days[i].setEnabled(true)

if(d==day) days[i].setSelected(true)

else days[i].setSelected(false)

i++

}

for(i<42i++){

days[i].setEnabled(false)

days[i].setSelected(false)

days[i].setText("")

}

}

//单击年份面板选择整个年份字符串

void SelectionYear(){

Year.setSelectionStart(0)

Year.setSelectionEnd(Year.getText().length())

}

//单击月份面板选择整个月份字符串

void SelectionMonth(){

Month.setSelectionStart(0)

Month.setSelectionEnd(Month.getText().length())

}

//月份面板响应鼠标单击事件

void Month_mouseClicked(MouseEvent e) {

//SelectionMonth()

inputMonth()

}

//检验输入的月份

void inputMonth(){

String s

if(Month.getText().endsWith("月"))

{

s=Month.getText().substring(0,Month.getText().length()-1)

}

else s=Month.getText()

month=Integer.parseInt(s)-1

this.showMe()

}

//月份面板键盘敲击事件响应

void Month_keyPressed(KeyEvent e) {

if(e.getKeyChar()==10)

inputMonth()

}

//年份面板响应鼠标单击事件

void Year_mouseClicked(MouseEvent e) {

//SelectionYear()

inputYear()

}

//年份键盘敲击事件响应

void Year_keyPressed(KeyEvent e) {

//System.out.print(new Integer(e.getKeyChar()).byteValue())

if(e.getKeyChar()==10)

inputYear()

}

//检验输入的年份字符串

void inputYear() {

String s

if(Year.getText().endsWith("年"))

{

s=Year.getText().substring(0,Year.getText().length()-1)

}

else s=Year.getText()

year=Integer.parseInt(s)

this.showMe()

}

//以字符串形式返回日期,yyyy-mm-dd

public String getDate(){return Out.getText()}

//以字符串形式输入日期,yyyy-mm-dd

public void setDate(String date){

if(date!=null){

StringTokenizer f = new StringTokenizer(date, "-")

if(f.hasMoreTokens())

year = Integer.parseInt(f.nextToken())

if(f.hasMoreTokens())

month = Integer.parseInt(f.nextToken())

if(f.hasMoreTokens())

day = Integer.parseInt(f.nextToken())

cal.set(year,month,day)

}

this.showMe()

}

//以日期对象形式输入日期

public void setTime(Date date){

cal.setTime(date)

this.iniCalender()

this.showMe()

}

//返回日期对象

public Date getTime(){return cal.getTime()}

//返回当前的日

public int getDay() {

return day

}

//设置当前的日

public void setDay(int day) {

this.day = day

cal.set(this.year,this.month,this.day)

this.showMe()

}

//设置当前的年

public void setYear(int year) {

this.year = year

cal.set(this.year,this.month,this.day)

this.showMe()

}

//返回当前的年

public int getYear() {

return year

}

//返回当前的月

public int getMonth() {

return month

}

//设置当前的月

public void setMonth(int month) {

this.month = month

cal.set(this.year,this.month,this.day)

this.showMe()

}

//刷新

public void showMe(){

this.showDays()

this.showMonth()

this.showYear()

this.showDate()

}

}

public class TestJCalendar {

public static void main(String[] args) {

JFrame f=new JFrame()

f.setContentPane(new JCalendar())

f.pack()

//f.setResizable(false)

f.show()

}

}