📄 mycalendar.java
字号:
package mine;
import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.*;
import javax.swing.event.*;
public class MyCalendar extends JFrame
{
JComboBox months=new JComboBox(); //改变月份的下拉菜单
JSpinner years=new JSpinner(); //改变年份的选择栏
JTextField[] dates=new JTextField[49]; //显示月历的文本框数组
JLabel jmonth; //提示月份标签
JLabel jyear; //提示年份标签
GregorianCalendar cal=new GregorianCalendar(); //用于获取时间的Java GregorianCalendar类对象
int today_Month=cal.get(Calendar.MONTH); //获取的当前月份
int today_Year=cal.get(Calendar.YEAR); //获取的当前年份
public MyCalendar() //构造方法,设计万年历面板
{
super("Calendar");
Container contentPane=getContentPane(); //面板设计的层次是由大到小,由里及表,在构造方法中依次进行定义、创建、添加、设置的操作,这样代码的可读性可以提高,也方便日后的修改
contentPane.setLayout(new BorderLayout());
JPanel layMonYear=new JPanel();
JPanel layDates=new JPanel();
layDates.setBorder(BorderFactory.createLoweredBevelBorder());//创建一个具有凹入斜面边缘的边框,将组件当前背景色的较亮的色度用于突出显示,较暗的色度用于阴影
contentPane.add(layMonYear,BorderLayout.NORTH);
contentPane.add(layDates,BorderLayout.CENTER);
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setResizable(false);
years=new JSpinner(new SpinnerNumberModel(today_Year,today_Year-100,today_Year+100,1));//创建JSpinner
years.setEditor(new JSpinner.NumberEditor(years, "#"));//设置Spinner的界面类型
jyear=new JLabel("YEAR",JLabel.CENTER);
jmonth=new JLabel("MONTH",JLabel.CENTER);
layMonYear.add(jmonth); //添加进面板
layMonYear.add(months);
layMonYear.add(jyear);
layMonYear.add(years);
layDates.setLayout(new GridLayout(7,7));
for(int n=0;n<49;n++) //利用数组设置TextField,简单而快捷,一举多得
{
dates[n]=new JTextField();
dates[n].setEnabled(false);
dates[n].setHorizontalAlignment(JTextField.CENTER);
dates[n].setDisabledTextColor(Color.BLACK);
layDates.add(dates[n]);
}
for(int n=1;n<=12;n++)
months.addItem(n);
months.addActionListener(new Processor(this)); //监听器位置保证程序刚运行时有初值
years.addChangeListener(new Processor(this));
months.setSelectedIndex(today_Month);
for(int n=0;n<7;n++)
{
dates[n].setBackground(Color.BLUE);
dates[n].setDisabledTextColor(Color.white);
}
dates[0].setText("日");
dates[1].setText("一");
dates[2].setText("二");
dates[3].setText("三");
dates[4].setText("四");
dates[5].setText("五");
dates[6].setText("六");
//pack();
}
class Processor implements ActionListener,ChangeListener //监听ComboBox和JSpinner,并作相应事件响应
{
MyCalendar mine; //事件响应的万年历对象
int firstDayOfWeek; //一个月中的第一天在第一周中的位置
int year,month,sumDayOfMonth; //当前年、月和一个月的天数
public Processor(MyCalendar mine) //构造函数,获取响应的万年历对象
{
this.mine=mine;
}
public void actionPerformed(ActionEvent e) //用于响应ComboBox的事件
{
setDates();
}
public void stateChanged(ChangeEvent e) //用于响应JSpinner的事件
{
setDates();
}
public void setDates() ////用于更改JTestField数组的值
{
for(int i=7;i<49;i++) //每次改变年或月,都应将dates重置为空,否则会出现数据重叠
{
mine.dates[i].setText("");
}
year=Integer.parseInt(mine.years.getValue().toString()); //获取JSpinner当前值所对应的年份
month=mine.months.getSelectedIndex(); //获取所选当前JComboBox中index所对应月份
sumDayOfMonth=31;
mine.cal.set(year, month, 1);
firstDayOfWeek=mine.cal.get(Calendar.DAY_OF_WEEK); //计算出该年该月所对应的第一天是星期几firstDayOfWeek(即在一星期中的位置)
if(month==0||month==2||month==4||month==6||month==7|month==9||month==11)//根据月份,利用if—else语句设置该月总天数sumDayOfMonth
{
sumDayOfMonth=31;
}
else if(month==3||month==5||month==8||month==10)
{
sumDayOfMonth=30;
}
else if(month==1)
{
if(mine.cal.isLeapYear(year)) //通过年份,判断是否为闰年,设置2月份天数
{
sumDayOfMonth=29;
}
else sumDayOfMonth=28;
}
firstDayOfWeek+=6;
for(int i=firstDayOfWeek;i<sumDayOfMonth+firstDayOfWeek;i++)//从第一天开始到该年该月最后一天,利用循环设置相应位置文本框显示文本,以完成该年该月月历
{
mine.dates[i].setText((i-firstDayOfWeek+1)+"");
}
}
}
public static void main(String args[])////创建一个万年历以做测试
{
MyCalendar myCalendar=new MyCalendar();
myCalendar.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -