`
雪馨25
  • 浏览: 124949 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

【java】实现日历对话框

阅读更多

一、实现效果


二、代码

 

//此类为构造了一个JPanel,其中添加了一个JTextField和一个Button,点击按钮弹出日历选择对话框 
public class CalendarDialog extends JPanel {
	private static final long serialVersionUID = 1L;

	private int width = 220; // 日期控件的宽度
	private int height = 220; // 日期控件的高度
	static CalendarDialog date;
	private GridBagLayout gridBagLayout1 = new GridBagLayout();
	private JTextField dateField = new JTextField();
//	JButton btnChoose = new JButton("▼");
	DateChooserButton btnChoose = new DateChooserButton("▼"); // ▼是指:▼下拉箭头的unicode码
	private String parten;
	private Container owner;
	private int length = 80;
	private Point startPoint;
	javax.swing.JDialog dateFrame;

	public Point getStartPoint() {
		return startPoint;
	}

	public void setStartPoint(Point startPoint) {
		this.startPoint = startPoint;
	}

	public CalendarDialog(Container owner, int length) {
		this.owner = owner;
		this.parten = "yyyy-MM-dd";
		this.length = length;
		try {
			init();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	/**
	 * 根据一个所有者和一个日期的显示格式构造一个DateChooser对象。
	 */
	public CalendarDialog(Container owner, String partten, int length) {
		this.owner = owner;
		this.parten = partten;
		this.length = length;
		try {
			init();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 根据一个所有者和一个日期的显示格式构造一个DateChooser对象。
	 */
	public CalendarDialog(Container owner, String partten) {
		this.owner = owner;
		this.parten = partten;
		try {
			init();
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	/**
	 * 以缺省的partten构建DateChooser对象 日期选择框的所有者必须是Frame或者是JFrame对象。
	 */
	public CalendarDialog(Container owner) {
		this.owner = owner;
		this.parten = "yyyy-MM-dd";
		try {
			init();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 系统初始化
	 * 
	 * @throws Exception
	 */
	private void init() throws Exception {
		dateField.setToolTipText("单击右边的按钮即可选择日期");
		btnChoose.setToolTipText("单击即可选择日期");
		this.setLayout(gridBagLayout1);
		dateField.setEditable(false);
		btnChoose.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				CalendarDialog.this.btnChoose_actionPerformed(e);
			}
		});
		Date date = new Date();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(parten);
		this.setText(simpleDateFormat.format(date));
		this.add(dateField, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(
						0, 0, 5, 0), this.length, 0));
		this.add(btnChoose, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
				GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(
						0, 0, 5, 0), 0, 0));
	}

	public void setToolTipText(String text) {
		dateField.setToolTipText(text);
		btnChoose.setToolTipText(text);

	}

	/**
	 * 下拉按钮的事件处理
	 * 
	 * @param e
	 *            ActionEvent
	 */
	public void btnChoose_actionPerformed(ActionEvent e) {
		 dateFrame = new javax.swing.JDialog();
		 dateFrame.setModal(false);//设置为非模式对话框
		 dateFrame.setUndecorated(true);
			  dateFrame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);//设置模式
	    dateFrame.setLocationRelativeTo(dateField);
		int x = dateFrame.getLocation().x - (dateField.getWidth() / 2);
		int y = dateFrame.getLocation().y + (dateField.getHeight() / 2);
		dateFrame.setLocation(new Point(x, y));
		dateFrame.setSize(width, height);

		dateFrame.addWindowListener(new WindowAdapter() {
			// 在任意的非日期选择区单击,则日期选择组件将变为非活动状态,自动释放资源。
			public void windowDeactivated(WindowEvent e) {
//				dateFrame.setModal(false);
				javax.swing.JDialog f = (javax.swing.JDialog) e.getSource();
				parentDialog.setModal(true);
				f.dispose();
			}
		});
		DatePanel datePanel = new DatePanel(dateFrame, parten);
		dateFrame.getContentPane().setLayout(new BorderLayout());
		dateFrame.getContentPane().add(datePanel);
		dateFrame.setVisible(true);
	}

	/**
	 * 得到日期控件中的值
	 * 
	 * @return String
	 */
	public String getText() {
		return this.dateField.getText();
	}

	/**
	 * 设置文本域的值
	 * 
	 * @param text
	 *            String
	 */
	public void setText(String text) {
		this.dateField.setText(text);
	}

	/**
	 * 该方法非常有用,是外部直接访问的TextField对象。
	 * 
	 * @return JTextField
	 */
	public JTextField getDateField() {
		return dateField;
	}

	/**
	 * 内部类,日期选择控件的主体,封装了所有日期选择的内容,主要是一个Panel
	 */
	class DatePanel extends JPanel implements MouseListener, ChangeListener {
		private static final long serialVersionUID = 1L;

		int startYear = 1970; // 默认【最小】显示年份
		int lastYear = 2100; // 默认【最大】显示年份

		Color backGroundColor = Color.gray; // 底色
		// 月历表格配色----------------//
		Color palletTableColor = Color.white; // 日历表底色
		Color weekFontColor = Color.blue; // 星期文字色
		Color dateFontColor = Color.black; // 日期文字色
		Color weekendFontColor = Color.red; // 周末文字色
		Color moveButtonColor = Color.BLUE; // 鼠标移动的日历底色
		Color todayBtnColor = Color.pink; // 今天的日历底色
		// 控制条配色------------------//
		Color controlLineColor = Color.pink; // 控制条底色
		Color controlTextColor = Color.white; // 控制条标签文字色

		JSpinner yearSpin;
		JSpinner monthSpin;
		JSpinner hourSpin;
		JButton[][] daysButton = new JButton[6][7];

		javax.swing.JDialog f;

		JPanel dayPanel = new JPanel(); // 日期panel
		JPanel yearPanel = new JPanel();

		Calendar calendar = Calendar.getInstance();
		String pattern;

		/**
		 * 日期选择控件放在了非模态对话框中
		 */
		public DatePanel(javax.swing.JDialog target, String pattern) {
			super();
			System.out.println("5555555555DatePanel");

			this.f = target;
			this.pattern = pattern;

			setLayout(new BorderLayout());
			setBorder(new LineBorder(backGroundColor, 2));
			setBackground(backGroundColor);
			initButton(); // 初始化放置日期的按钮。
			createYearAndMonthPanal(); //
			this.flushWeekAndDayPanal(calendar); // 之前必须先保证放置日期的按钮已经初始化。
			this.setLayout(new BorderLayout());
			this.add(yearPanel, BorderLayout.NORTH);
			this.add(dayPanel, BorderLayout.CENTER);
		}

		/**
		 * 日期选择控件的按钮初始化
		 */
		private void initButton() {
			System.out.println("666666666initButton");
			int actionCommandId = 1;
			for (int i = 0; i < 6; i++) {
				for (int j = 0; j < 7; j++) {
					JButton numberButton = new JButton();
					numberButton.setBorder(BorderFactory.createEmptyBorder());
					numberButton.setHorizontalAlignment(SwingConstants.CENTER);
					numberButton.setActionCommand(String
							.valueOf(actionCommandId));

					numberButton.addMouseListener(this);

					numberButton.setBackground(palletTableColor);
					numberButton.setForeground(dateFontColor);
					numberButton.setText(String.valueOf(actionCommandId));
					numberButton.setPreferredSize(new Dimension(25, 25));
					daysButton[i][j] = numberButton;
					actionCommandId++;
				}
			}
		}

		private Date getNowDate() {
			return Calendar.getInstance().getTime();
		}

		private Calendar getNowCalendar() {
			Calendar result = Calendar.getInstance();
			return result;
		}

		private Date getSelectDate() {
			return calendar.getTime();
		}

		/**
		 * 创建年月日的面板
		 */
		private void createYearAndMonthPanal() {
			System.out.println("777777777createYearAndMonthPanal");
			Calendar c = getNowCalendar();
			int currentYear = c.get(Calendar.YEAR);
			int currentMonth = c.get(Calendar.MONTH) + 1;
			int currentHour = c.get(Calendar.DAY_OF_MONTH);
			yearSpin = new JSpinner(new javax.swing.SpinnerNumberModel(
					currentYear, startYear, lastYear, 1));
			monthSpin = new JSpinner(new javax.swing.SpinnerNumberModel(
					currentMonth, 1, 12, 1));
			hourSpin = new JSpinner(new javax.swing.SpinnerNumberModel(
					currentHour, 0, 31, 1));

			yearPanel.setLayout(new java.awt.FlowLayout());
			yearPanel.setBackground(controlLineColor);

			yearSpin.setPreferredSize(new Dimension(60, 23));
			yearSpin.setName("Year");
			yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
			yearSpin.addChangeListener(this);
			yearPanel.add(yearSpin);

			JLabel yearLabel = new JLabel("年");
			yearLabel.setForeground(controlTextColor);
			yearPanel.add(yearLabel);

			monthSpin.setPreferredSize(new Dimension(40, 23));
			monthSpin.setName("Month");
			monthSpin.addChangeListener(this);
			yearPanel.add(monthSpin);

			JLabel monthLabel = new JLabel("月");
			monthLabel.setForeground(controlTextColor);
			yearPanel.add(monthLabel);

			hourSpin.setPreferredSize(new Dimension(40, 23));
			hourSpin.setName("Day");
			hourSpin.addChangeListener(this);
			yearPanel.add(hourSpin);

			JLabel hourLabel = new JLabel("日");
			hourLabel.setForeground(controlTextColor);
			yearPanel.add(hourLabel);
		}

		/**
		 * 根据日期刷新显示面板
		 */
		private void flushWeekAndDayPanal(Calendar c) {
			c.set(Calendar.DAY_OF_MONTH, 1);
			c.setFirstDayOfWeek(0);
			int firstdayofWeek = c.get(Calendar.DAY_OF_WEEK);
			int lastdayofWeek = c.getActualMaximum(Calendar.DAY_OF_MONTH);
			String colname[] = { "日", "一", "二", "三", "四", "五", "六" };
			int today = getNowCalendar().get(Calendar.DAY_OF_MONTH);
			// 设置固定字体,以免调用环境改变影响界面美观
			dayPanel.setFont(new java.awt.Font("宋体", java.awt.Font.PLAIN, 12));
			dayPanel.setLayout(new GridBagLayout());
			dayPanel.setBackground(Color.white);

			JLabel cell;

			for (int i = 0; i < 7; i++) {
				cell = new JLabel(colname[i]);
				cell.setHorizontalAlignment(JLabel.CENTER);
				cell.setPreferredSize(new Dimension(25, 25));
				if (i == 0 || i == 6) {
					cell.setForeground(weekendFontColor);
				} else {
					cell.setForeground(weekFontColor);
				}
				dayPanel.add(cell, new GridBagConstraints(i, 0, 1, 1, 0.0, 0.0,
						GridBagConstraints.CENTER, GridBagConstraints.NONE,
						new Insets(0, 0, 0, 0), 0, 0));
			}

			int actionCommandId = 1;
			for (int i = 0; i < 6; i++) {
				for (int j = 0; j < 7; j++) {

					JButton numberButton = daysButton[i][j];
					actionCommandId = Integer.parseInt(numberButton
							.getActionCommand());
					if (actionCommandId == today) {
						numberButton.setBackground(todayBtnColor);
					}
					if ((actionCommandId + firstdayofWeek - 2) % 7 == 6
							|| (actionCommandId + firstdayofWeek - 2) % 7 == 0) {
						numberButton.setForeground(weekendFontColor);
					} else {
						numberButton.setForeground(dateFontColor);
					}

					if (actionCommandId <= lastdayofWeek) {
						int y = 0;
						if ((firstdayofWeek - 1) <= (j + firstdayofWeek - 1) % 7) {
							y = i + 1;
						} else {
							y = i + 2;
						}
						dayPanel.add(numberButton, new GridBagConstraints((j
								+ firstdayofWeek - 1) % 7, y, 1, 1, 0.0, 0.0,
								GridBagConstraints.CENTER,
								GridBagConstraints.NONE,
								new Insets(0, 0, 0, 0), 0, 0));
					}
				}
			}
		}

		private int getSelectedYear() {
			return ((Integer) yearSpin.getValue()).intValue();
		}

		private int getSelectedMonth() {
			return ((Integer) monthSpin.getValue()).intValue();
		}

		private int getSelectedHour() {
			return ((Integer) hourSpin.getValue()).intValue();
		}

		/**
		 * 年月小时的事件处理
		 * @param e  ChangeEvent
		 */
		public void stateChanged(ChangeEvent e) {
			JSpinner source = (JSpinner) e.getSource();
			if (source.getName().equals("Day")) {
				calendar.set(Calendar.DAY_OF_MONTH, getSelectedHour());
				return;
			}
			if (source.getName().equals("Year")) {
				calendar.set(Calendar.YEAR, getSelectedYear());
				dayPanel.removeAll();
				this.flushWeekAndDayPanal(calendar);
				dayPanel.revalidate();
				dayPanel.updateUI();
				return;
			}
			if (source.getName().equals("Month")) {
				calendar.set(Calendar.MONTH, getSelectedMonth() - 1);
				dayPanel.removeAll();
				this.flushWeekAndDayPanal(calendar);
				dayPanel.revalidate();
				dayPanel.updateUI();
				return;
			}
		}
		/**
		 * 日期按钮的鼠标事件处理
		 * @param e MouseEvent
		 */
		public void mouseClicked(MouseEvent e) {
			if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 1) {
				JButton source = (JButton) e.getSource();
				String value = source.getText();
				int day = Integer.parseInt(value);
				calendar.set(Calendar.DAY_OF_MONTH, day);
				Date selectDate = this.getSelectDate();
				SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
						pattern);
				CalendarDialog.this
						.setText(simpleDateFormat.format(selectDate));

//				int year = calendar.get(Calendar.YEAR);
//				int month = calendar.get(Calendar.MONTH) + 1;
				// System.out.println(year + "年" + month + "月" + day + "日");
				f.dispose();
			}
		}

		public void mousePressed(MouseEvent e) {
			// 空实现接口中的方法,不能删除
		}

		public void mouseReleased(MouseEvent e) {
			// 空实现接口中的方法,不能删除
		}

		/**
		 * 鼠标移动到日历中的事件 
		 * @param e MouseEvent
		 */
		public void mouseEntered(MouseEvent e) {
			JButton jbutton = (JButton) e.getSource();
			jbutton.setBackground(moveButtonColor);

		}

		/**
		 * 鼠标移出日历中的事件
		 * 
		 * @param e
		 *            MouseEvent
		 */
		public void mouseExited(MouseEvent e) {
			JButton jbutton = (JButton) e.getSource();
			int comm = Integer.parseInt(jbutton.getActionCommand());
			int today = getNowCalendar().get(Calendar.DAY_OF_MONTH);
			if (comm == today) {
				jbutton.setBackground(todayBtnColor);
			} else {
				jbutton.setBackground(palletTableColor);
			}
		}
	}

	/**
	 * 内部类,改变按钮的边框不可编辑区,使外观更加协调。
	 */
	class DateChooserButton extends JButton {
		private static final long serialVersionUID = 1L;

		public DateChooserButton(String text) {
			super(text);
			setPreferredSize(new Dimension(30, 21));
		}

		public Insets getInsets() {
//			return new Insets(0, 0, 0, 0);
			return new Insets(4, 2, 0, 2);
		}

	}

	public static void main(String[] args) {

		JDialog frame2 = new JDialog();
		// frame2.getContentPane().setLayout(null);
		JPanel jp = new JPanel();
		jp.setSize(200, 100);
		JPanel jp1 = new JPanel();
		jp1.setSize(200, 100);
		CalendarDialog date = new CalendarDialog(jp);
		jp.add(date);
		jp1.add(jp);
		frame2.getContentPane().add(jp1);
		frame2.setSize(500, 400);
		frame2.setTitle("实例");
		frame2.setVisible(true);

	}
}


代码记录方便查询使用

 

 

分享到:
评论

相关推荐

    java课程设计:日历记事本

    (2)定时提醒:用户可以针对某一天来添加,删除和编辑这一天的日程提醒信息,当系统时间和提醒时间相吻合时,给出具有提示信息的对话框; (3)查询信息:用户可以查询到某个月的所有提示信息。 四. 提交的成果 1. ...

    java实现《桌面日历》源码,答辩ppt,实习计划书,实习报告

    (2)建立JavaFrame顶级容器,建立不同的类实现相应的功能。 (3)建立GUI图形界面; (4)集合农历、公历的计算与转化算法; (5)设立和后台进程,对所记事时间进行配对,届时会弹出对预定时间的提醒。

    Java开发技术大全(500个源代码).

    signByIF.java 用if语句实现符号函数示例 triangleStar.java 输出一个由*组成的直角三角形 upperToLowCase.java 大写转换成小写 variableScopeExample.java 变量使用范围示例 第3章 示例描述:本章学习对象和类...

    JAVA简易时间 日历课程设计

    通过编写一个基于JAVA的应用系统综合实例,自定义一个日历组件显示日期和时间并进行适当的功能扩充,实践Java语言编程技术。 2. 系统设计 2.1 设计目标 一个完整的程序应具有以下功能: 1)显示当月日历、当前日期、...

    java源码包---java 源码 大量 实例

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    MaterialCalendarviewDialogDemo:MaterialCalendarDialog【Material样式的日历对话框】

    MaterialCalendarviewDialogDemo

    c++日历记事本课设

    1) 问题定义:创建日历记事本,实现对某日期的事情进行记录等功能。 2) 问题分析:通过对“日历记事本”这一题材的分析,我需要四个类来实现其“日历”和“记事本”这两大功能。通过主类calender创建主窗口,再用...

    Java简单日历

    万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查询,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。本实验是对图形用户界面,...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    日历记事本 (含感想和源代码)

    日历记事本 其功能为: 设计GUI界面的日历记事本。系统将日历、记事本功能结合在一起,... 3 使用鼠标左键单击选定的日期,如已有记录内容,系统将弹出对话框提示该日已有记录内容,并询问用户是否用记事本显示该内容。

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java源码包4

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java源码包3

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    java源码包2

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    java2实验实用模板代码

    实验2 字体对话框 36 实验3 华容道游戏 39 上机实践8 多线程 47 实验1 线程的4种状态 47 实验2 线程之间共享数据 49 实验3 挂起、恢复和终止线程 51 上机实践9 输入输出流 55 实验1 文件加密 55 实验2 给文件的内容...

    java jdk实列宝典 光盘源代码

    日历:使用swing和awt实现一个图形化的日历可以查询星期、日期和年份信息(CalenderTrain.java);标准计算器(Callulator.java);更改组建外观,对日历设置几个显示外观(lookandfeel.java);自定义对话框Dialog...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    山东大学java实验指导书大一

    附:利用对话框输入输出 21 附:引入包 23 实验六 数组 25 实验目的 25 实验内容 25 有关输出日历的两点说明 25 特别提示 26 附:Eclipse中命令行参数的输入方法 26 实验七 继承和多态 28 实验目的 28 实验内容 28 ...

Global site tag (gtag.js) - Google Analytics