一. 题目要求
编写一个程序,有一个窗口,该窗口为BorderLayout布局。窗口的中心添加一个Panel容器:pCenter,pCenter的布局是7行7列的GridLayout布局,pCenter的中放置49个标签,用来显示日历。窗口北面添加一个Panel容器pNorth,其布局是FlowLayout布局,pNorth放置两个按钮:nextMonth和previousMonth按钮,单击nextMonth,可以显示当前月的下一个月的日历;单击previousMonth按钮,可以显示当前月的上一个月的日历。窗口的南面添加一个Panel容器pSouth,其布局是FlowLayout布局,pSouth中放置一个标签用来显示一些信息。请完成界面设计和相关功能。运行结果如下图所示。
二.我的思路
显然题目可分解为三个Jpanel容器来实现,对于题目中的center容器,我又将它采用BorderLayout的布局,分为一个1行7列的GridLayout布局(用来存放星期数)和一个6行7列的GridLayout布局(该布局来存放日历),PNorth注意button的监听,PSouth注意两个Lable,可以和日历一起更新。
三.完成效果
四.源码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarApp implements ActionListener {
private JFrame jFrame;
private JButton button1, button2;
private JPanel pCenter = new JPanel(new GridLayout(6, 7));
private JPanel pNorth = new JPanel(new FlowLayout());
private JPanel pSouth = new JPanel(new FlowLayout());
private Date current;
private JLabel label;
private SimpleDateFormat dateFormat;
//private JPanel year, month, day;
private JLabel year, month;
CalendarApp(){
current = new Date();
dateFormat = new SimpleDateFormat("yyyy-MM");
jFrame = new JFrame("日历");
jFrame.setLayout(new BorderLayout());
jFrame.setSize(494,293);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocationRelativeTo(null);
button1 = new JButton("上月");
button2 = new JButton("下月");
pNorth.add(button1);
pNorth.add(button2);
button1.addActionListener(this);
button2.addActionListener(this);
jFrame.add(pNorth,BorderLayout.NORTH);
year = new JLabel();
month = new JLabel();
JPanel Calendar = new JPanel(new BorderLayout());
JPanel week = new JPanel(new GridLayout(1,7));
String[] weekNo = {"日", "一", "二", "三", "四", "五", "六"};
for (int i = 0; i < weekNo.length; i++) {
JLabel w = new JLabel(weekNo[i],JLabel.CENTER);
week.add(w);
}
Calendar.add(week,BorderLayout.NORTH);
PrintCalendar(current);
Calendar.add(pCenter,BorderLayout.CENTER);
jFrame.add(Calendar,BorderLayout.CENTER);
pSouth.add(year);
pSouth.add(month);
jFrame.add(pSouth,BorderLayout.SOUTH);
jFrame.setVisible(true);
}
private void PrintCalendar(Date date){
pCenter.removeAll();
year.setText("日历:"+dateFormat.format(date).subSequence(0,4)+"年");
month.setText(dateFormat.format(date).substring(5)+"月");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE,1);
int weekDay = calendar.get(Calendar.DAY_OF_WEEK)-1;
int dayMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
for (int i = 0; i < weekDay; i++) {
pCenter.add(new JLabel());
}
for(int i = 1;i <= dayMonth; i++){
JLabel day =new JLabel(String.valueOf(i),JLabel.CENTER);
pCenter.add(day);
}
int c = 42 - dayMonth - weekDay;
for (int i = 0;i < c;i++){
pCenter.add(new JLabel());
}
pCenter.updateUI();
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == button1){
Calendar calendar = Calendar.getInstance();
calendar.setTime(current);
calendar.add(Calendar.MONTH, -1);
current = calendar.getTime();
PrintCalendar(current);
}else if (e.getSource() == button2){
Calendar calendar = Calendar.getInstance();
calendar.setTime(current);
calendar.add(Calendar.MONTH, 1);
current = calendar.getTime();
PrintCalendar(current);
}
}
public static void main(String[] args) {
new CalendarApp();
}
}