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; /** *

Title: Swing日历

*

Description: 操作日期

* @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=0;i<42;i++){ 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