package exercise;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
WindowBoxLayout w = new WindowBoxLayout();
w.setBounds(500, 250, 300, 200);
}
}
class WindowBoxLayout extends JFrame implements ActionListener{
//JPanel panel;
Box boxH;
Box boxV1;
Box boxV2;
Font font1=new Font("楷体",Font.PLAIN,20);
Font font2=new Font("楷体",Font.PLAIN,25);
JTextField j1;
JPasswordField j2;
Button b1,b2;
WindowBoxLayoutListener listener;
public WindowBoxLayout(){
setLayout(new java.awt.FlowLayout());
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init(){
setTitle("山东省省内火车订票系统");
//add(new Label("12306订票系统"));
boxH = Box.createHorizontalBox();
boxV1 = Box.createVerticalBox();
boxV2 = Box.createVerticalBox();
JLabel l1=new JLabel("账户");
l1.setFont(font1);
boxV1.add(l1);
JLabel l2=new JLabel("密码");
l2.setFont(font1);
boxV1.add(l2);
j1=new JTextField(16);
j2=new JPasswordField(16);
boxV2.add(j1);
boxV2.add(j2);
boxH.add(boxV1);
boxH.add(Box.createHorizontalStrut(10));
boxH.add(boxV2);
add(boxH);
boxH.add(Box.createHorizontalStrut(20));
b1=new Button("确定");
b1.setFont(font2);
listener = new WindowBoxLayoutListener();
listener.setWindowBoxLayout(this);
b1.addActionListener(listener);
add(b1);
boxH.setBackground(Color.pink);
b2=new Button("注册");
b2.setFont(font2);
listener = new WindowBoxLayoutListener();
listener.setWindowBoxLayout(this);
b2.addActionListener(listener);
add(b2);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
class window2 extends JFrame{
Font font;
Box box;
JTextField textField1;
JPasswordField textFiled2;
window2Listener listener=new window2Listener();
JLabel label1,label2,label3;
Button button1,button2;
public window2() {
setLayout(new java.awt.FlowLayout());
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void init(){
font = new Font("楷体",Font.PLAIN,20);
box = Box.createVerticalBox();
label1=new JLabel("注册账户名:");
label1.setFont(font);
box.add(label1);
box.add(Box.createVerticalStrut(12));
textField1=new JTextField(16);
box.add(textField1);
box.add(Box.createVerticalStrut(12));
label2=new JLabel("密码:");
label2.setFont(font);
box.add(label2);
box.add(Box.createVerticalStrut(12));
textFiled2 = new JPasswordField(16);
box.add(textFiled2);
box.add(new JLabel("(密码必须含有大小写字母,数字以及其他特殊字符,且长度大于8位且不超过16位)"));
listener.setwindow2(this);
//button.addActionListener(listener);
box.add(Box.createVerticalStrut(30));
button1 = new Button("确定");
button1.setFont(font);
button1.addActionListener(listener);
box.add(button1);
box.add(Box.createVerticalStrut(30));
button2=new Button("返回上层");
button2.setFont(font);
button2.addActionListener(listener);
box.add(button2);
add(box);
}
}
class WindowBoxLayoutListener implements ActionListener{
WindowBoxLayout w;
JPanel panel=new JPanel();
JLabel label;
public void setWindowBoxLayout(WindowBoxLayout w) {
this.w=w;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==w.b1) {
String s1=w.j1.getText();
String s2=w.j2.getText();
User u=new User();
u.setUserName(s1);
u.setUserPwd(s2);
Login l=new Login();
if(l.login(u)==1) { //返回1:账号名不存在 返回2:密码错误 返回3:登入成功
label=new JLabel("账户名不存在");
panel.add(label);
w.add(panel);
w.setVisible(true);
}else if(l.login(u)==2) {
//密码错误;
label=new JLabel("密码错误!");
panel.add(label);
w.add(panel);
w.setVisible(true);
}else {
//登入成功,切换界面
w.setVisible(false);
Window3 w3=new Window3();
w3.setTitle(" 你好,"+w.j1.getText());
w3.setBounds(500,200,600,500);
w3.setVisible(true);
w3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
else if(e.getSource()==w.b2) {
w.setVisible(false);
window2 w2=new window2();
w2.setBounds(500, 250, 700, 500);
}
}
}
class window2Listener implements ActionListener{
window2 w2;
boolean b1=false,b2=false;
JLabel label;
Font font = new Font("楷体",Font.PLAIN,25);
public void setwindow2(window2 w) {
this.w2=w;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==w2.button1) {
//账户
if(b1==false) {
userNameValidation user1=new userNameValidation();
user1.setWindow(w2);
b1=user1.test(w2.textField1.getText());
}
//密码
if(b2==false) {
userPwdValidation user2=new userPwdValidation();
user2.setWindow2(w2);
b2=user2.test(w2.textFiled2.getText());
}
if(b1==true&&b2==true) { /注册成功
User u=null;
String s1=w2.textField1.getText();
String s2=w2.textFiled2.getText();
LocalDate ld=LocalDate.now();
u=new User(s1,s2,String.format("%ty-&tm-%td",ld,ld,ld));
Register r=new Register(u);
if(r.check(u)) {
// 有重名
w2.box.add(Box.createVerticalStrut(10));
label=new JLabel("有重名");
label.setFont(font);
w2.box.add(label);
w2.setVisible(true);
}
else {
if(r.register(u))
// 注册成功!
w2.box.add(Box.createVerticalStrut(10));
label=new JLabel("注册成功!");
label.setFont(font);
w2.box.add(label);
w2.setVisible(true);
}
}
}
else if(e.getSource()==w2.button2) {
w2.setVisible(false);//返回上层
WindowBoxLayout w1 = new WindowBoxLayout();
w1.setBounds(500, 250, 300, 200);
}
}
}
abstract class Validation{
String str;
public Pattern pattern;
Validation(String s){
pattern =Pattern.compile(s);
}
boolean test(String s) {
return false;
}
}
class userNameValidation extends Validation{
Font font=new Font("黑体",Font.BOLD,15);
Label label;
window2 w;
public void setWindow(window2 w) {
this.w=w;
}
Matcher matcher;
String str1="[A-Z]+";
String str2="[a-z]+";
userNameValidation(){
super("");
}
boolean test(String s) {
if(s.length()<8) {
//登入名小于8位
label=new Label(" 登入名小于8位!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else if(s.length()>16) {
//登入名大于16位
label=new Label(" 登入名大于8位!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else {
pattern=Pattern.compile(str1);
matcher=pattern.matcher(s);
if(matcher.matches()) {
//该登入名无小写字母
label=new Label(" 该登入名无小写字母!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else{pattern=Pattern.compile(str2);
matcher=pattern.matcher(s);
if(matcher.matches()) {
//该登入名无大写字母
label=new Label(" 该登入名无大写字母!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else {
//该登入名符合命名要求
label=new Label(" 该登入名符合命名要求!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return true;
// userPwdValidation user2=new userPwdValidation();
// user2.test(w.textFiled2.getText());
}
}
}
}
}
class userPwdValidation extends Validation{
Font font=new Font("黑体",Font.BOLD,15);
window2 w=new window2();
JLabel label;
public void setWindow2(window2 w) {
this.w=w;
}
public Pattern pattern;
public Matcher matcher;
String str2="[^(A-Z)]+";
String str3="[^a-z]+";
String str4="[a-zA-Z0-9]+";
String str5="[^0-9]+";
boolean bo;
userPwdValidation(){
super("");
}
boolean test(String s) {
if(s.length()<8) {
//该密码长度小于8
label=new JLabel("该密码长度小于8!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else if(s.length()>16) {
//长度大于16
label=new JLabel("该密码长度大于16!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else {
pattern=Pattern.compile(str2);
matcher=pattern.matcher(s);
bo=matcher.matches();
if(bo==true) {
//不含大写字母
label=new JLabel("该密码不含大写字母!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}else {
pattern=Pattern.compile(str3);
matcher=pattern.matcher(s);
bo=matcher.matches();
if(bo==true) {
//不含小写字母
label=new JLabel("该密码不含小写字母!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}else {
pattern =Pattern.compile(str4);
matcher=pattern.matcher(s);
bo=matcher.matches();
if(bo==true) {
//不含非字母和数字的特殊字符
label=new JLabel("该密码不含非字母和数字的特殊字符!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else {
pattern =Pattern.compile(str5);
matcher=pattern.matcher(s);
bo=matcher.matches();
if(bo==true) {
//不含数字
label=new JLabel("该密码不含数字!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return false;
}
else {
//密码符合要求
label=new JLabel("该密码符合要求!");
label.setFont(font);
w.box.add(label);
w.setVisible(true);
return true;
}
}
}
}
}
}}
class User{
private String userName;
private String userPwd;
private String regDatetime;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getRegDatetime() {
return regDatetime;
}
public void setRegDatetime(String regDatetime) {
this.regDatetime = regDatetime;
}
User(){
;
}
User(String userName,String userPwd, String regDatetime){
this.userName=userName;
this.userPwd=userPwd;
this.regDatetime=regDatetime;
}
User(String user){
String s[]=user.split("[ ]+");
this.userName=s[0];
this.userPwd=s[1];
this.regDatetime=s[2];
}
public String toString() {
return this.userName+" "+this.userPwd+" "+this.regDatetime;
}
}
class FileDAO{
private File file;
private Writer fWriter;
private BufferedWriter bWriter;
private Scanner sc;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public Writer getfWriter() {
return fWriter;
}
public void setfWriter(Writer fWriter) {
this.fWriter = fWriter;
}
public BufferedWriter getbWriter() {
return bWriter;
}
public void setbWriter(BufferedWriter bWriter) {
this.bWriter = bWriter;
}
public Scanner getSc() {
return sc;
}
public void setSc(Scanner sc) {
this.sc = sc;
}
FileDAO(String fileName){
int index=fileName.lastIndexOf("\");
String path =fileName.substring(0, index);
File fPath=new File(path);
if(!fPath.exists()) {
fPath.exists();
}
this.file=new File(fileName);
if(!this.file.exists()) {
try {
this.file.createNewFile();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
boolean writerDateToFile(String user) {
boolean b=false;
try {
this.fWriter=new FileWriter(this.file,true);
this.bWriter=new BufferedWriter(this.fWriter);
this.bWriter.write(user+"n");
b=true;
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
this.bWriter.close();
this.fWriter.close();
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
return b;
}
ArrayList
ArrayList
try {
this.sc=new Scanner(this.file);
this.sc.useDelimiter("n");
while(sc.hasNext()) {
userList.add(sc.next());
}
}catch(Exception e) {
e.printStackTrace();
}finally {
sc.close();
}
return userList;
}
}
class Register{
private User user;
Register(User user){
this.user=user;
}
boolean register(User user) {
this.user=user;
FileDAO fDAO =new FileDAO("C:\Users\hp\Desktop\大二下\java\期末作业\user.txt");
return fDAO.writerDateToFile(this.user.toString());
}
boolean check(User user) {
boolean b=false;
FileDAO fDAO=new FileDAO("C:\Users\hp\Desktop\大二下\java\期末作业\user.txt");
ArrayList
User u=null;
for(String s:userList) {
u=new User(s);
if(u.getUserName().equals(user.getUserName())) {
b=true;
break;
}
}
return b;
}
}
class Login {
private User user;
Login(User user){
this.user=user;
}
Login(){
;
}
int login(User user) {
boolean b=false;
FileDAO fDAO=new FileDAO("C:\Users\hp\Desktop\大二下\java\期末作业\user.txt");
ArrayList
User u=null;
for(String s:userList) {//返回1:账号名不存在 返回2:密码错误 返回3:登入成功
u=new User(s);
if(u.getUserName().equals(user.getUserName())) {
if(u.getUserPwd().equals(user.getUserPwd())) {
return 3;
}
return 2;
}
}
return 1;
}
}
class Window3 extends JFrame implements ActionListener{
JTextField longingname;
JTextField field;
JLabel dateshow;//显示选择日期到界面窗口
Box boxH=Box.createHorizontalBox();
JLabel label_seat;
Font font1=new Font("楷体",Font.PLAIN,25);
Font font2=new Font("楷体",Font.PLAIN,15);
String seat="未选择座位";
Button A,B,C,D,E,F,过道;
//获取日期显示在文本框
private JTextField dateField = new JTextField();
String[] stations={"青岛","潍坊","淄博","济南","聊城"};
JComboBox beginStation,endStation;
JButton selectDateButton,okButton,cancelButton;
JLabel date;
Window3() {
//----------------------日期
super();
Container c=getContentPane();
c.setLayout(new GridLayout(9,1));
JPanel p1,p2,p3,p4,p5,p6,p7,p8;
// 座位选择
buttonActionListener buttonListener = new buttonActionListener();
buttonListener.setWindow3(this);
A=new Button("A");
A.addActionListener(buttonListener);
B=new Button("B");
B.addActionListener(buttonListener);
C=new Button("C");
C.addActionListener(buttonListener);
D=new Button("D");
D.addActionListener(buttonListener);
E=new Button("E");
E.addActionListener(buttonListener);
F=new Button("F");
F.addActionListener(buttonListener);
过道=new Button("过道");
boxH.add(A);
boxH.add(B);
boxH.add(C);
boxH.add(D);
boxH.add(过道);
boxH.add(E);
boxH.add(F);
label_seat=new JLabel("座位选择:");
label_seat.setFont(font1);
p1=new JPanel();
p2=new JPanel();
p3=new JPanel();
p4=new JPanel();
p5=new JPanel();
p6=new JPanel();
p7=new JPanel();//身份证号
p8=new JPanel();//手机号
JLabel longing =new JLabel("乘车人姓名:");
longing.setFont(font1);
p2.add(longing);
longingname=new JTextField(10);
p2.add(longingname);
JLabel label_id = new JLabel("身份证号:");
label_id.setFont(font1);
p7.add(label_id);
JTextField label_idNumber = new JTextField(18);
p7.add(label_idNumber);
p7.setVisible(true);
JLabel label_phone = new JLabel("手机号:");
label_phone.setFont(font1);
p8.add(label_phone);
JTextField label_phoneNumber = new JTextField(11);
p8.add(label_phoneNumber);
p8.setVisible(true);
beginStation=new JComboBox(stations);//输入起点站
beginStation.setSelectedIndex(1);
JLabel l1=new JLabel("起点车站:");
l1.setFont(font1);
p4.add(l1);
p4.add(beginStation);
//为组合框添加监视器
endStation=new JComboBox(stations);//输入起点站
endStation.setSelectedIndex(1);
JLabel l2=new JLabel("终点车站:");
l2.setFont(font1);
p5.add(l2);
p5.add(endStation);
JButton chooseStartDateButton;
JButton okButton;
JButton replaceButton;
chooseStartDateButton=new JButton("选择出发日期");
//出发日期监听器
chooseStartDateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JDateChooser chooseDate =new JDateChooser();
chooseDate.setBounds(400,400,400,400);
chooseDate.setVisible(true);
dateshow.setText(chooseDate.dateShow());
}});
//---------------------------------------------------
okButton=new JButton("确定");
replaceButton=new JButton("重置");
//----------------------------------------------------
//确定监听器
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String nameStr=longingname.getText().trim();
String start_station=(String)(beginStation.getSelectedItem());
String end_station=(String)(endStation.getSelectedItem());
String idNumber=label_idNumber.getText();
String phoneNumber=label_phoneNumber.getText();
String chooseyear,choosemonth,choosedate;
JDateChooser gg = new JDateChooser();
chooseyear=String.valueOf(gg.getYear());
choosemonth=String.valueOf(gg.getMonth());
choosedate=String.valueOf(gg.getDate());
// String dateShow=gg.getDateFormat("yyyy-MM-dd HH:mm:ss");
//String dateShow=getDate();//gg.dateShow();
String display1="乘车人: "+nameStr+"n"+"身份证号: "+idNumber+'n'+"手机号: "+phoneNumber+"n座位: "+seat+"n起点站: "+start_station+"n终点站: "+end_station+"n日期: "+chooseyear+"日"+choosemonth+"月"+choosedate+"日";//dateShow.getYear()+"日"+dateShow.getYear()+"月"+dateShow.getDay()+"日";
JOptionPane.showMessageDialog(null, display1);
}
});
//重置按钮监听器实现
replaceButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
longingname.setText("");
beginStation.getSelectedItem();
endStation.getSelectedItem();
dateshow.setText("");
}
});
//----------------------------------------------------
JDateChooser gg = new JDateChooser();
p3.add(chooseStartDateButton);
dateshow=new JLabel();
p3.add(dateshow);
p1.add(okButton);
p1.add(replaceButton);
c.add(p2);
c.add(p7);
c.add(p8);
c.add(label_seat);
c.add(boxH);
c.add(p4);
c.add(p5);
c.add(p3);
c.add(p1,BorderLayout.SOUTH);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
class buttonActionListener implements ActionListener{
Window3 w3;
public void setWindow3(Window3 w) {
this.w3=w;
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==w3.A) {
w3.seat="座位 A";
}else if(e.getSource()==w3.B) {
w3.seat="座位 B";
}else if(e.getSource()==w3.C) {
w3.seat="座位 C";
}else if(e.getSource()==w3.D) {
w3.seat="座位 D";
}else if(e.getSource()==w3.E) {
w3.seat="座位 E";
}else if(e.getSource()==w3.F) {
w3.seat="座位 F";
}
}
}
final class JDateChooser extends JDialog
{ // 定义相关参数
private int year = 0;
private int month = 0;
private int date = 0;
//日期选择背景色
private Color selectColor = Color.pink;
// 日期背景色
private Color dateColor = Color.white;
// 日期鼠标进入背景色
private Color dateHoverColor = Color.white;
// 日期标题背景色
private Color dateTitleColor = Color.white;
// 日期标题字体颜色
private Color dateTitleFontColor = Color.black;
//日期字体颜色
private Color dateFontColor = Color.black;
//日期是否有效标志
private boolean flag = false;
/
public void setDate(int year, int month, int date)
{
if (year >= minYear && year <= maxYear)
{
this.year = year;
}
else
{
return;
}
if (month >= 1 && month <= 12)
{
this.month = month;
}
else
{
return;
}
if (date > 0 && date <= getDaysInMonth(year, month))
{
this.date = date;
}
else
{
return;
}
}
public boolean getFlag()
{
return flag;
}
// 构造方法
public JDateChooser()
{
initComponent();
initComponentData();
addComponent();
addListener();
setDialogAttribute();
}
// 实例化组件
private void initComponent()
{
jbYearPre = new JButton();
jbYearNext = new JButton();
jbMonthPre = new JButton();
jbMonthNext = new JButton();
jcbYear = new JComboBox
jcbMonth = new JComboBox
jlDays = new JLabel[7][7];
jbChoose = new JButton();
jbToday = new JButton();
jbCancel = new JButton();
}
//初始化组件数据
private void initComponentData()
{
jbYearPre.setText("←");
jbYearNext.setText("→");
jbMonthPre.setText("↑");
jbMonthNext.setText("↓");
Calendar calendar = Calendar.getInstance();
if (year != 0 && month != 0 && date != 0)
{
calendar.set(year, month - 1, date);
}
else
{
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
date = calendar.get(Calendar.DAY_OF_MONTH);
}
initYear();
jcbYear.setSelectedItem(year + "年");
for (int i = 1; i <= 12; i++)
{
jcbMonth.addItem(i + "月");
}
jcbMonth.setSelectedItem(month + "月");
for (int i = 0; i < 7; i++)
{
JLabel temp = new JLabel();
temp.setHorizontalAlignment(JLabel.CENTER);
temp.setVerticalAlignment(JLabel.CENTER);
temp.setOpaque(true);
temp.setBackground(dateTitleColor);
temp.setForeground(dateTitleFontColor);
jlDays[0][i] = temp;
}
for (int i = 1; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
JLabel temp = new JLabel();
temp.setHorizontalAlignment(JLabel.CENTER);
temp.setVerticalAlignment(JLabel.CENTER);
temp.setOpaque(true);
temp.setForeground(dateFontColor);
jlDays[i][j] = temp;
}
}
String[] days = { "日", "一", "二", "三", "四", "五", "六" };
for (int i = 0; i < 7; i++)
{
jlDays[0][i].setText(days[i]);
}
jbChoose.setText("选择");
jbToday.setText("今日");
jbCancel.setText("取消");
changeDate();
}
// 初始化显示年份范围
private void initYear()
{
jcbYear.removeAllItems();
for (int i = minYear; i <= maxYear; i++)
{
jcbYear.addItem(i + "年");
}
}
private void addComponent()
{
// 添加背部组件
JPanel north = new JPanel();
north.add(jbYearPre);
north.add(jbMonthPre);
north.add(jcbYear);
north.add(jcbMonth);
north.add(jbMonthNext);
north.add(jbYearNext);
//---------------
this.add(north, "North");
//----------------
// 添加中间组件
JPanel center = new JPanel(new GridLayout(7, 7));
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
center.add(jlDays[i][j]);
}
}
this.add(center);
// 添加南部组件
JPanel jpSouth = new JPanel();
// jpSouth.add(startTime);
//jpSouth.add(endTime);
jpSouth.add(jbChoose);
jpSouth.add(jbToday);
jpSouth.add(jbCancel);
this.add(jpSouth, "South");
}
private int getDaysInMonth(int year, int month)
{
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
if (isLeapYear(year))
{
return 29;
}
return 28;
default:
return 0;
}
}
//清空日期
private void clearDate()
{
for (int i = 1; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
jlDays[i][j].setText("");
}
}
}
// 更改日期
private void changeDate()
{
refreshLabelColor();
clearDate();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
int day_in_week = calendar.get(Calendar.DAY_OF_WEEK);
int days = getDaysInMonth(year, month);
if (date > days)
{
date = 1;
}
int temp = 0;
for (int i = day_in_week - 1; i < 7; i++)
{
temp++;
jlDays[1][i].setText(temp + "");
if (temp == date)
{
jlDays[1][i].setBackground(selectColor);
}
}
for (int i = 2; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
temp++;
if (temp > days)
{
return;
}
jlDays[i][j].setText(temp + "");
if (temp == date)
{
jlDays[i][j].setBackground(selectColor);
}
}
}
}
private void addListener()
{
LabelMouseListener labelMouseListener = new LabelMouseListener();
for (int i = 1; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
jlDays[i][j].addMouseListener(labelMouseListener);
}
}
ButtonActionListener buttonActionListener = new ButtonActionListener();
jbYearPre.addActionListener(buttonActionListener);
jbYearNext.addActionListener(buttonActionListener);
jbMonthPre.addActionListener(buttonActionListener);
jbMonthNext.addActionListener(buttonActionListener);
jbChoose.addActionListener(buttonActionListener);
jbToday.addActionListener(buttonActionListener);
jbCancel.addActionListener(buttonActionListener);
ComboBoxItemListener comboBoxItemListener = new ComboBoxItemListener();
jcbYear.addItemListener(comboBoxItemListener);
jcbMonth.addItemListener(comboBoxItemListener);
}
private int parseYearOrMonth(String yearOrMonth)
{
return Integer.parseInt(yearOrMonth.substring(0, yearOrMonth.length() - 1));
}
private boolean isLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
private void setDialogAttribute()
{
this.setModal(true);
this.setTitle("选择出发日期时间");
}
private void refreshLabelColor()
{
for (int i = 1; i < 7; i++)
{
for (int j = 0; j < 7; j++)
{
jlDays[i][j].setBackground(dateColor);
}
}
}
public int getMinYear()
{
return minYear;
}
public int getMaxYear()
{
return maxYear;
}
public void setMinAndMaxYear(int minYear, int maxYear)
{
if (minYear > maxYear || minYear < 1900 || maxYear > 9999)
{
return;
}
this.minYear = minYear;
this.maxYear = maxYear;
initYear();
}
public Color getSelectColor()
{
return selectColor;
}
public void setSelectColor(Color selectColor)
{
this.selectColor = selectColor;
}
//获得日期背景颜色
public Color getDateColor()
{
return dateColor;
}
//设置日期背景颜色
public void setDateColor(Color dateColor)
{
this.dateColor = dateColor;
}
//获得日期鼠标进入背景颜色
public Color getDetaHoverColor()
{
return dateHoverColor;
}
// 设置日期鼠标进入背景颜色
public void setDateHoverColor(Color dateHoverColor)
{
this.dateHoverColor = dateHoverColor;
}
// 获得日期标题背景颜色
public Color getDateTitleColor()
{
return dateTitleColor;
}
// 设置日期标题背景颜色
public void setDateTitleColor(Color dateTitleColor)
{
this.dateTitleColor = dateTitleColor;
}
//获得日期标题字体颜色
public Color getDateTitleFontColor()
{
return dateTitleFontColor;
}
// 设置日期标题字体颜色
public void setDateTitleFontColor(Color dateTitleFontColor)
{
this.dateTitleFontColor = dateTitleFontColor;
}
// 获得日期字体颜色
public Color getDateFontColor()
{
return dateFontColor;
}
// 设置日期字体颜色
public void setDateFontColor(Color dateFontColor)
{
this.dateFontColor = dateFontColor;
}
//获得选择年份
public int getYear()
{
return year;
}
// 获得选中月份
public int getMonth()
{
return month;
}
// 获得选中天为当月第几天
public int getDate()
{
return date;
}
// 获得选中天为一周中第几天
public int getDayOfWeek()
{
return getCalendar().get(Calendar.DAY_OF_WEEK);
}
//获得选中天为一年中第几天
public int getDayOfYear()
{
return getCalendar().get(Calendar.DAY_OF_YEAR);
}
// 获得日期对象
public Date getDateObject()
{
return getCalendar().getTime();
}
//获得以指定规则格式化的日期字符串
public String getDateFormat(String format)
{
return new SimpleDateFormat(format).format(getDateObject());
}
//获得Calendar对象
private Calendar getCalendar()
{
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, date);
return calendar;
}
// 标签鼠标监听
final class LabelMouseListener extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
JLabel temp = (JLabel) e.getSource();
if (!temp.getText().equals(""))
{
int date = Integer.parseInt(temp.getText());
{
if (date != JDateChooser.this.date)
{
JDateChooser.this.date = date;
refreshLabelColor();
temp.setBackground(selectColor);
}
}
}
}
@Override
public void mouseEntered(MouseEvent e)
{
JLabel temp = (JLabel) e.getSource();
if (!temp.getText().equals(""))
{
temp.setBackground(dateHoverColor);
}
}
@Override
public void mouseExited(MouseEvent e)
{
JLabel temp = (JLabel) e.getSource();
if (!temp.getText().equals(""))
{
if (Integer.parseInt(temp.getText()) != date)
{
temp.setBackground(dateColor);
}
else
{
temp.setBackground(selectColor);
}
}
}
}
// 按钮动作监听
final class ButtonActionListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == jbYearPre)
{
int select = jcbYear.getSelectedIndex();
if (select > 0)
{
jcbYear.setSelectedIndex(select - 1);
}
}
else if (e.getSource() == jbYearNext)
{
int select = jcbYear.getSelectedIndex();
if (select < jcbYear.getItemCount() - 1)
{
jcbYear.setSelectedIndex(select + 1);
}
}
else if (e.getSource() == jbMonthPre)
{
int select = jcbMonth.getSelectedIndex();
if (select > 0)
{
jcbMonth.setSelectedIndex(select - 1);
}
}
else if (e.getSource() == jbMonthNext)
{
int select = jcbMonth.getSelectedIndex();
if (select < jcbMonth.getItemCount() - 1)
{
jcbMonth.setSelectedIndex(select + 1);
}
}
else if (e.getSource() == jbChoose)
{
flag = true;
closeDateChooser();
}
else if (e.getSource() == jbToday)
{
flag = true;
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
date = calendar.get(Calendar.DATE);
closeDateChooser();
}
else if (e.getSource() == jbCancel)
{
flag = false;
closeDateChooser();
}
}
}
final class ComboBoxItemListener implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
if (e.getSource() == jcbYear)
{
int year = parseYearOrMonth(jcbYear.getSelectedItem().toString());
if (year != JDateChooser.this.year)
{
JDateChooser.this.year = year;
changeDate();
}
}
else if (e.getSource() == jcbMonth)
{
int month = parseYearOrMonth(jcbMonth.getSelectedItem().toString());
if (month != JDateChooser.this.month)
{
JDateChooser.this.month = month;
changeDate();
}
}
}
}
}



