`
雪馨25
  • 浏览: 129365 次
  • 性别: 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);

	}
}


代码记录方便查询使用

 

 

分享到:
评论

相关推荐

    在swt开发中实现的一个小小的日历对话框

    ### 在SWT开发中实现的日历对话框 #### 概述 SWT(Standard Widget Toolkit)是Eclipse平台上的一种用于创建图形用户界面的工具包。它提供了丰富的组件库,允许开发者构建高性能、外观本地化的应用程序。本文将...

    DatePicker日历对话框

    本文将深入探讨两种实现`DatePicker`日历对话框的方法,并介绍如何通过它们来实现各种自定义效果。 ### 1. 基础使用 #### 1.1 XML布局声明 在你的`activity`或`fragment`的布局文件中,可以声明一个`DatePicker`。...

    四种Java Swing日历组件

    这种方式通常通过结合`JTextField`和自定义的日历对话框实现。用户点击文本框时,会弹出一个包含日历视图的对话框,用户可以在其中选择日期,然后选择的日期会显示在文本框内。这种设计简洁直观,适用于需要快速...

    java小日历

    总的来说,“java小日历”是一个基础的Java GUI应用,使用了Swing库中的`JFrame`和`JDialog`组件来实现日历和日程管理功能。虽然存在一些未完成的功能,但它提供了一个学习和改进的基础,对于Java GUI编程初学者来说...

    自己制作的JAVA日历源码

    本项目“自己制作的JAVA日历源码”是一个模仿Windows 7小日历工具的实现,旨在提供一个简洁易用的日历界面,用户可以查看日期、切换月份和年份,甚至可能包含一些基本的日程管理功能。 首先,这个项目的核心是Java ...

    用Java实现日历记事本源代码.doc

    在Java编程中,创建一个日历记事本应用是一个常见的任务,这有助于用户管理日常活动和计划。在提供的文档中,我们看到一个名为`CalendarPad`的类,它实现了`MouseListener`接口,用于处理用户的鼠标事件。这个类是...

    用Java实现日历记事本.doc

    - 实现了日志的保存、读取和删除功能,并提供了相应的用户确认对话框。 - **Year 类**: - 负责处理年份的增减逻辑。 - 包括输入年份的处理以及“上一年”、“下一年”按钮的事件监听。 - 通过事件监听器实现...

    java课程设计:日历记事本

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

    java语言 实现日历

    根据给定的信息,我们可以深入探讨如何使用Java编程语言来实现一个简单但实用的日历功能。该程序能够根据用户输入的年份和月份显示相应的月份日历。以下是对该程序涉及的关键知识点进行详细解释: ### 1. 用户输入...

    Java swing日历控件

    JDatePicker则是另一个流行的Java日历组件,它提供了一个直观的日期选择对话框。使用JDatePicker,你需要导入以下库: ```java import net.sourceforge.jdatepicker.JDatePicker; import ...

    Java 编写的一个日历的应用程序

    总的来说,开发一个Java日历应用程序涉及到GUI设计、事件处理、日期操作等多个核心Java编程概念。通过熟练掌握这些知识点,我们可以构建出功能强大的日历工具,为用户提供直观、易用的日历查看和管理体验。

    Java日历组件及使用示例.pdf

    根据提供的文件内容,我们可以分析出以下关于Java日历组件及其使用示例的知识点: 1. Java日历组件的概念:在Java中,日历组件通常是指用于日期和时间管理的类库和组件,例如AWT和Swing库中的相关组件。AWT...

    Java编写日历面板代码及调用 Eclipse可用

    以下是一个基于Java Swing的日历选择器(DateChooser)的实现,适用于Eclipse开发环境。 1. **组件导入**: 首先,你需要导入相关的Java类库,如`java.awt.*`、`javax.swing.*`等,这些库包含了创建日历面板所需的...

    java日期日历控件 希望大家喜欢

    通过JCalendar,你可以创建一个弹出的日历对话框,或者将其嵌入到其他组件中。以下是一些关键特性: 1. **日期选择**:用户可以通过点击日历控件来选择特定的日期。 2. **时间选择**:除了日期,JCalendar还可以...

    java实现桌面精灵(java源代码)(一个日历)

    Java Swing提供了`JOptionPane`类,可以创建简单的提示对话框,但若要实现分层显示,可能需要自定义组件,例如使用`JDialog`或`JWindow`。这需要考虑窗口的位置、大小、透明度以及关闭机制,确保提示信息不会干扰...

    日历(可放入java swing里作日期的选择)

    `MyCalendar.java` 文件很可能是这个日历组件的主要实现代码,它可能包含了Java Swing的相关类和方法,如JFrame、JPanel、JButton等,用于构建日历视图和交互逻辑。开发者可能通过重写特定的事件监听器(如...

    android日历的实现

    在项目文件`MyCalendar`中,可能包含了自定义日历视图的布局文件、自定义日历视图的Java代码以及相关的逻辑处理。通过分析这个文件,你可以深入理解上述各个步骤的具体实现细节。 总之,实现一个Android日历功能...

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

    MaterialCalendarviewDialogDemo是基于Java实现的一个项目,它展示了如何在Android应用中使用Material Design风格的日历对话框。Material Design是Google推出的一种设计语言,强调简洁、直观且富有层次感的用户界面...

    java日历记事本

    总结来说,"java日历记事本"项目涵盖了Java日期和时间API的使用、GUI编程(Swing或JavaFX)、事件处理、数据存储和恢复、用户交互逻辑以及软件设计原则等多个重要知识点。通过完成这样的项目,学生不仅可以加深对...

    基于Java的GUI界面的日历记事本

    【基于Java的GUI界面的日历记事本】是一款集成了日历和记事功能的桌面应用程序,它利用Java的图形用户界面(GUI)技术来提供一个直观易用的平台,让用户能够轻松地管理日常生活中的事件和提醒。在这个系统中,用户...

Global site tag (gtag.js) - Google Analytics