/**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;
}
}
}
}
试使用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;
}
}
}
}
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;
/**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;
}
}
}}