/**P245_13:编程练习
试使用JComboBox类实现合法日期的输入,即建立3个JComboBox
类实例分别管理年月日的输入。首先确定输入年和月的下拉框,则应该计
算出日的下拉框所显示的内容,考虑月份和闰年的因素。
**/package com.JavaSeries.Java;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
public class P245_13 {
   //定义类成员属性
   public Frame frame;
   public JLabel JLYEAR; 
   public JLabel JLMONTH;
   public JLabel JLDAY;
   public JComboBox JCBYEAR;
   public JComboBox JCBMONTH;
   public JComboBox JCBDAY;
   public boolean append=false;
   //构造函数
   public P245_13() {
       init();
   }   //init成员方法
   public void init() {
        //建立框架
       JFrame frame = new JFrame("simple calculator");
//设置框架大小
       frame.setSize(400,300);
        //设置框架位置
       frame.setLocation(200,200);
       //获得框架的默认面板
       Container contentPane=frame.getContentPane();
        //设置内容窗格容器的布局管理器为FlowLayout
       contentPane.setLayout(new GridLayout(1,2));   
       frame.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent evt) {
               System.exit(0);
           }
       });
       
       //设置年月的固定面板
       Panel panel = new Panel();
       //Panel.setLayout(new GridLayout(1,5)); 
       //加入相关文本框
       JLYEAR=new JLabel("year:19");
       JLMONTH=new JLabel("month:");
       JLDAY=new JLabel("day:");
       String year[]=new String[50];
       String month[]=new String[12];
       for(int i=50;i<=99;i++)
year[i-50]=String.valueOf(i);
       for(int j=1;j<=12;j++)
month[j-1]=String.valueOf(j);
       JCBYEAR=new JComboBox(year);
       JCBMONTH=new JComboBox(month);
        //将文本框加入到面板中
       panel.add(JLYEAR);
       panel.add(JCBYEAR);
       panel.add(JLMONTH);
       panel.add(JCBMONTH);
       panel.add(JLDAY);        //设置监听器
       YEARListener YEAR=new YEARListener();
       MONTHListener MONTH=new MONTHListener();       JCBYEAR.addActionListener(YEAR);
       JCBMONTH.addActionListener(MONTH);        //将年月的面板加入默认容器中
contentPane.add(panel);
      
       //新建面板
       Panel daypanel=new Panel();       
      //设置日期的面板
       daypanel.add(JCBDAY);
//将日期面板加入默认容器中
       contentPane.add(daypanel);
       //frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}public void go(){
      frame.setVisible(true);
      //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//命令行函数入口
public static void main(String args[]){
new P245_13().go();
 
}//实现选择年份时的监听器
class YEARListener implements ActionListener{
public void actionPerformed(ActionEvent e){
//返回所设置年份值
String getyear=String.valueOf(JCBYEAR.getSelectedIndex());
int GETYEAR=Integer.parseInt(getyear); 

              if(((GETYEAR+1900)%400==0)||(((GETYEAR+1900)%4==0)&&((GETYEAR+1900)%100!=0)))
                   {append=true;}
}
}//实现选择月份时的监听器
class MONTHListener implements ActionListener{
        public void actionPerformed(ActionEvent e){
String day[]=new String[31];
//返回所设置月份值
                String getmonth=String.valueOf(JCBMONTH.getSelectedIndex());
int GETMONTH=Integer.parseInt(getmonth);
                switch(GETMONTH){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:for(int k=1;k<=31;k++)
day[k-1]=Integer.toString(k);
JCBDAY=new JComboBox(day);break;
case 4:
case 6:
case 9:
case 11:for(int k=1;k<=30;k++)
day[k-1]=Integer.toString(k);
JCBDAY=new JComboBox(day);break;
case 2:if(append){for(int k=1;k<=29;k++)
day[k-1]=Integer.toString(k);
                                  //闰年入口,操作完后重置append值为false
JCBDAY=new JComboBox(day);append=false;}
                               else{for(int k=1;k<=28;k++)
day[k-1]=Integer.toString(k);
JCBDAY=new JComboBox(day);};break;
}
}
}
}
                
                

解决方案 »

  1.   

    第一,你的程序init方法中的
    daypanel.add(JCBDAY);
    这句中的JCBDAY变量没有初始化,运行的时候会产生NullPointerException第二,类的frame变量并没有被初始化,而你在init方法中的
    JFrame frame = new JFrame("simple calculator");
    初始化的并不是类的frame变量,而是你新建立的一个init方法内的变量,这个变量出了init方法就会被释放,而你真正想引用的类的frame变量并没有被初始化。应该改为:
    frame = new JFrame("simple calculator");
    同时
    public Frame frame;
    改为:
    public JFrame frame;
      

  2.   

    应该怎么将监听后处理的数组值day[]返回给JCBDAY啊?这是最重要的
      

  3.   

    我从新改过后的代码,但编译运行后发现那监听器一点用都没有!
    /**P245_13:编程练习/**P245_13:编程练习
    试使用JComboBox类实现合法日期的输入,即建立3个JComboBox
    类实例分别管理年月日的输入。首先确定输入年和月的下拉框,则应该计
    算出日的下拉框所显示的内容,考虑月份和闰年的因素。
    **/package com.JavaSeries.Java;
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
    import java.awt.event.*;
    public class P245_13 {
       //定义类成员属性
       public JFrame frame;
       public JLabel JLYEAR; 
       public JLabel JLMONTH;
       public JLabel JLDAY;
       public JComboBox JCBYEAR;
       public JComboBox JCBMONTH;
       public JComboBox JCBDAY;
       public boolean append=false;
       //构造函数
       public P245_13() {
           init();
       }   //init成员方法
       public void init() {
            //建立框架
           frame = new JFrame("simple calculator");
    //设置框架大小
           frame.setSize(400,300);
            //设置框架位置
           frame.setLocation(200,200);
           //获得框架的默认面板
           Container contentPane=frame.getContentPane();
            //设置内容窗格容器的布局管理器为FlowLayout
           contentPane.setLayout(new FlowLayout());   
           frame.addWindowListener(new WindowAdapter() {
               public void windowClosing(WindowEvent evt) {
                   System.exit(0);
               }
           });
           
           //设置年月的固定面板
           Panel panel = new Panel();
           //Panel.setLayout(new GridLayout(1,5)); 
           //加入相关文本框
           JLYEAR=new JLabel("year:19");
           JLMONTH=new JLabel("month:");
           JLDAY=new JLabel("day:");
           String year[]=new String[50];
           String month[]=new String[12];
           String day[]=new String[31];
           for(int i=50;i<=99;i++)
    year[i-50]=String.valueOf(i);
           for(int j=1;j<=12;j++)
    month[j-1]=String.valueOf(j);
           for(int k=1;k<=31;k++)
    day[k-1]=String.valueOf(0);       JCBYEAR=new JComboBox(year);
           JCBMONTH=new JComboBox(month);
           JCBDAY=new JComboBox(day);
            //将文本框加入到面板中
           panel.add(JLYEAR);
           panel.add(JCBYEAR);
           panel.add(JLMONTH);
           panel.add(JCBMONTH);
           panel.add(JLDAY);
           panel.add(JCBDAY);       //设置监听器
           YEARListener YEAR=new YEARListener();
           MONTHListener MONTH=new MONTHListener();       JCBYEAR.addActionListener(YEAR);
           JCBMONTH.addActionListener(MONTH);        //将年月的面板加入默认容器中
    contentPane.add(panel);
          
    }public void go(){
          frame.setVisible(true);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    //命令行函数入口
    public static void main(String args[]){
    new P245_13().go();
     
    }
    //实现选择年份时的监听器
    class YEARListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
    //返回所设置年份值
    String getyear=String.valueOf(JCBYEAR.getSelectedIndex());
    int GETYEAR=Integer.parseInt(getyear);               if(((GETYEAR+1900)%400==0)||(((GETYEAR+1900)%4==0)&&((GETYEAR+1900)%100!=0)))
                       {append=true;}
    }
    }//实现选择月份时的监听器
    class MONTHListener implements ActionListener{
            public void actionPerformed(ActionEvent e){
    String day[]=new String[31];
    //返回所设置月份值
                    String getmonth=String.valueOf(JCBMONTH.getSelectedIndex());
    int GETMONTH=Integer.parseInt(getmonth);
                    switch(GETMONTH){
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:for(int k=1;k<=31;k++)
    day[k-1]=Integer.toString(k);
    JCBDAY=new JComboBox(day);break;
    case 4:
    case 6:
    case 9:
    case 11:for(int k=1;k<=30;k++)
    day[k-1]=Integer.toString(k);
    JCBDAY=new JComboBox(day);break;
    case 2:if(append){for(int k=1;k<=29;k++)
    day[k-1]=Integer.toString(k);
                                      //闰年入口,操作完后重置append值为false
    JCBDAY=new JComboBox(day);append=false;}
                                   else{for(int k=1;k<=28;k++)
    day[k-1]=Integer.toString(k);
    JCBDAY=new JComboBox(day);};break;
    }
    }
    }}