关于这个话题,以前有很多帖子了,你可以搜一下

解决方案 »

  1.   

    我调试的结果, 很奇怪在actionPerformed不能add(new JLabel()), 我就改
    成JPanel了.
    package muticalendar;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.util.*;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class mutiCalendar2 {
      public static void main(String[] args) {
        mutiCalendarFrame2 frame = new mutiCalendarFrame2();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();
      }
    }class mutiCalendarFrame2 extends JFrame{
      public mutiCalendarFrame2(){
        setTitle("canendar");
        setSize(300, 300);
        Container contentPane = getContentPane();
        contentPane.add(panel, BorderLayout.CENTER);
        //add the inputField
        JPanel inputPanel = new JPanel();
        GregorianCalendar now = new GregorianCalendar();
        yearField = new JTextField(now.get(Calendar.YEAR)+"",4);
        JLabel yearLabel = new JLabel("年");
        monthField = new JTextField(now.get(Calendar.MONTH)+1+"",2);
        JLabel monthLabel = new JLabel("月");
        JButton button = new JButton("确定");
        inputPanel.add(yearField);
        inputPanel.add(yearLabel);
        inputPanel.add(monthField);
        inputPanel.add(monthLabel);
        inputPanel.add(button);
        button.addActionListener(new listener());
        contentPane.add(inputPanel,BorderLayout.SOUTH);
      }
      private class listener implements ActionListener{
        public void actionPerformed(ActionEvent evnet){
            int year = Integer.parseInt(yearField.getText());
            int month = Integer.parseInt(monthField.getText()) - 1;
            GregorianCalendar calendar = new GregorianCalendar(year, month, 1);
            days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            firstDayOftheFirstWeek = calendar.get(Calendar.DAY_OF_WEEK);
            panel.setDate(days, firstDayOftheFirstWeek);
        }
      }
      private JTextField yearField;
      private JTextField monthField;
      mutiCalendarPanel panel = new mutiCalendarPanel();
      private int days;
      private int firstDayOftheFirstWeek;
    }
    class mutiCalendarPanel extends JPanel{
      public mutiCalendarPanel(){
        GregorianCalendar calendar = new GregorianCalendar();
        int d = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int f = calendar.get(Calendar.DAY_OF_WEEK);
        setDate(d, f);
      }
      public void paintComponent(Graphics g){
        super.paintComponent(g);
        String[] a = new String[32];    String title = "星期日 星期一 星期二 星期三 星期四 星期五 星期六";
        g.drawString(title,10,10);
        for(int i = 0; i< a.length; i++){
          a[i] = "";
        }
        for (int i = 0; i <= days-firstDayOftheFirstWeek+1; i++) {
          a[firstDayOftheFirstWeek + i -1] = (i+1)+"";
        }
        int m = 1;
        int n = 1;
        String day = "";
        for(int i=0; i<a.length; i++){
            day = a[i]+"";
            if((i % 7) == 0){
              n++; m = 1;
            }
            g.drawString(day,  38*m ,n+10*n);
            m++;
        }  }
      public void setDate(int d, int f){
        days = d;
        firstDayOftheFirstWeek = f;
        repaint();
      }
      private int days;
      private int firstDayOftheFirstWeek;
    }