⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datechooserjbutton.java

📁 一个用于监控WEB服务器和数据库服务器的客户端程序。
💻 JAVA
字号:
package com.jobcn.ui;

import java.util.Date;
import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.text.ParseException;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.border.LineBorder;

public class DateChooserJButton extends JButton {

	public DateChooserJButton() {
		this("");
	}

	public DateChooserJButton(Window parent, JComponent jcomp) {
		this("");
		this.parent = parent;
		this.jcomp = jcomp;
	}

	public DateChooserJButton(Window parent, JComponent jcomp, String datePattern) {
		this("");
		this.parent = parent;
		this.jcomp = jcomp;
		this.datePattern = datePattern;
	}
	
	public DateChooserJButton(String title, Window parent, JComponent jcomp, String datePattern) {
		this("");
		setText(title);
		this.parent = parent;
		this.jcomp = jcomp;
		this.datePattern = datePattern;
	}
	
	public DateChooserJButton(String preLabel) {
		if (preLabel != null)
			this.preLabel = preLabel;

		setCursor(new Cursor(Cursor.HAND_CURSOR));
		
		super.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (dateChooser == null)
					dateChooser = new DateChooser();
				Point p = getLocationOnScreen();
				p.y = p.y + 30;
				dateChooser.showDateChooser(p);
			}
		});
	}
	
	private static Date getNowDate() {
		return Calendar.getInstance().getTime();
	}

	private static SimpleDateFormat getDefaultDateFormat() {
		return new SimpleDateFormat(datePattern);
	}
	
	public String getJComponentText() {
		String returnValue = "";
		if (jcomp instanceof JLabel) {
			returnValue = ((JLabel)jcomp).getText();
		}
		else if (jcomp instanceof JTextField) {
			returnValue = ((JTextField)jcomp).getText();
		}
		else if (jcomp instanceof JButton) {
			returnValue = ((JButton)jcomp).getText();
		}
		else if (jcomp instanceof JTextArea) {
			returnValue = ((JTextArea)jcomp).getText();
		}
		return returnValue;
	}

	public Date getDate() {
		String dateString = getJComponentText().substring(preLabel.length());
		try {
			return getDefaultDateFormat().parse(dateString);
		} catch (ParseException e) {
			return getNowDate();
		}
	}
	
	public void setDate(Date date) {
		if (jcomp instanceof JLabel) {
			((JLabel)jcomp).setText(preLabel + getDefaultDateFormat().format(date));
		}
		else if (jcomp instanceof JTextField) {
			((JTextField)jcomp).setText(preLabel + getDefaultDateFormat().format(date));
		}
		else if (jcomp instanceof JButton) {
			((JButton)jcomp).setText(preLabel + getDefaultDateFormat().format(date));
		}
		else if (jcomp instanceof JTextArea) {
			((JTextArea)jcomp).setText(preLabel + getDefaultDateFormat().format(date));
		}
	}

	private DateChooser dateChooser = null;
	private String preLabel = "";
	private Window parent;
	private JComponent jcomp;
	private static String datePattern = "yyyy-MM-dd";
	
	private class DateChooser extends JPanel implements ActionListener,
			ChangeListener {
		int startYear = 1980; // 默认【最小】显示年份
		int lastYear = 2050; // 默认【最大】显示年份
		int width = 200; // 界面宽度
		int height = 200; // 界面高度
		Color backGroundColor = Color.black; // 底色

		// 月历表格配色----------------//

		Color palletTableColor = new Color(238, 238, 238);//Color.white; // 日历表底色
		Color todayBackColor = Color.orange; // 今天背景色
		Color weekFontColor = Color.blue; // 星期文字色
		Color dateFontColor = Color.black; // 日期文字色
		Color weekendFontColor = Color.red; // 周末文字色
		
		// 控制条配色------------------//
		
		Color controlLineColor = new Color(111, 119, 151); // 控制条底色
		Color controlTextColor = Color.white; // 控制条标签文字色
		Color rbFontColor = Color.white; // RoundBox文字色
		Color rbBorderColor = Color.red; // RoundBox边框色
		Color rbButtonColor = Color.pink; // RoundBox按钮色
		Color rbBtFontColor = Color.red; // RoundBox按钮文字色
		
		JDialog dialog;
		JSpinner yearSpin;
		JSpinner monthSpin;
		JSpinner hourSpin;
		
		JButton[][] daysButton = new JButton[6][7];

		DateChooser() {
			setLayout(new BorderLayout());
			JPanel topYearAndMonth = createYearAndMonthPanal();
			add(topYearAndMonth, BorderLayout.NORTH);
			JPanel centerWeekAndDay = createWeekAndDayPanal();
			add(centerWeekAndDay, BorderLayout.CENTER);
		}

		private JPanel createYearAndMonthPanal() {
			Calendar c = getCalendar();
			int currentYear = c.get(Calendar.YEAR);
			int currentMonth = c.get(Calendar.MONTH) + 1;
			JPanel result = new JPanel();
			result.setLayout(new FlowLayout());
			result.setBackground(controlLineColor);
			yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,
					startYear, lastYear, 1));
			yearSpin.setPreferredSize(new Dimension(48, 20));
			yearSpin.setName("Year");
			yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
			yearSpin.addChangeListener(this);
			result.add(yearSpin);
			JLabel yearLabel = new JLabel("年");
			yearLabel.setForeground(controlTextColor);
			result.add(yearLabel);
			monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1,
					12, 1));
			monthSpin.setPreferredSize(new Dimension(35, 20));
			monthSpin.setName("Month");
			monthSpin.addChangeListener(this);
			result.add(monthSpin);

			JLabel monthLabel = new JLabel("月");
			monthLabel.setForeground(controlTextColor);
			result.add(monthLabel);
			return result;
		}

		private JPanel createWeekAndDayPanal() {
			String colname[] = { "日", "一", "二", "三", "四", "五", "六" };
			JPanel result = new JPanel();
			// 设置固定字体,以免调用环境改变影响界面美观
			result.setFont(new Font("宋体", Font.PLAIN, 12));
			result.setLayout(new GridLayout(7, 7));
			result.setBackground(palletTableColor);
			JLabel cell;

			for (int i = 0; i < 7; i++) {
				cell = new JLabel(colname[i]);
				cell.setHorizontalAlignment(JLabel.CENTER);
				if (i == 0 || i == 6){
					cell.setForeground(weekendFontColor);
				}
				else {
					cell.setForeground(weekFontColor);
				}
				result.add(cell);
			}

			int actionCommandId = 0;
			for (int i = 0; i < 6; i++) {
				for (int j = 0; j < 7; j++) {
					JButton numberButton = new JButton();
					numberButton.setBorder(null);
					numberButton.setHorizontalAlignment(SwingConstants.CENTER);
					numberButton.setActionCommand(String
							.valueOf(actionCommandId));
					numberButton.addActionListener(this);
					numberButton.setBackground(palletTableColor);
					if (j == 0 || j == 6)
						numberButton.setForeground(weekendFontColor);
					else
						numberButton.setForeground(dateFontColor);
					daysButton[i][j] = numberButton;
					result.add(numberButton);
					actionCommandId++;
				}
			}
			return result;
		}

		private JDialog createDialog(Window owner) {
			JDialog result;
			if (parent instanceof Frame) {
				result = new JDialog((Frame)owner, "日期选择", true);
			}
			else {
				result = new JDialog((Dialog)owner, "日期选择", true);
			}
			result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
			result.getContentPane().add(this, BorderLayout.CENTER);
			result.pack();
			result.setSize(width, height);
			return result;
		}

		private void showDateChooser(Point position) {
			if (parent instanceof Frame) {
				Frame owner = (Frame) SwingUtilities
						.getWindowAncestor(DateChooserJButton.this);
				if (dialog == null || dialog.getOwner() != owner)
					dialog = createDialog(owner);
				dialog.setLocation(getAppropriateLocation(owner, position));
			} else {
				Dialog owner = (Dialog) SwingUtilities
						.getWindowAncestor(DateChooserJButton.this);
				if (dialog == null || dialog.getOwner() != owner)
					dialog = createDialog(owner);
				dialog.setLocation(getAppropriateLocation(owner, position));
			}
			flushWeekAndDay();
			dialog.setVisible(true);
		}

		private Point getAppropriateLocation(Window owner, Point position) {
			Point result = new Point(position);
			Point p = owner.getLocation();
			int offsetX = (position.x + width) - (p.x + owner.getWidth());
			int offsetY = (position.y + height) - (p.y + owner.getHeight());
			if (offsetX > 0) {
				result.x -= offsetX;
			}
			if (offsetY > 0) {
				result.y -= offsetY;
			}
			return result;
		}

		private Calendar getCalendar() {
			Calendar result = Calendar.getInstance();
			result.setTime(getDate());
			return result;
		}

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

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

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

		private void dayColorUpdate(boolean isOldDay) {
			Calendar c = getCalendar();
			int day = c.get(Calendar.DAY_OF_MONTH);
			c.set(Calendar.DAY_OF_MONTH, 1);
			int actionCommandId = day - 2 + c.get(Calendar.DAY_OF_WEEK);
			int i = actionCommandId / 7;
			int j = actionCommandId % 7;
			if (isOldDay)
				daysButton[i][j].setForeground(dateFontColor);
			else
				daysButton[i][j].setForeground(todayBackColor);
		}

		private void flushWeekAndDay() {
			Calendar c = getCalendar();
			c.set(Calendar.DAY_OF_MONTH, 1);
			int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);
			int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK);
			for (int i = 0; i < 6; i++) {
				for (int j = 0; j < 7; j++) {
					String s = "";
					if (dayNo >= 1 && dayNo <= maxDayNo) {
						s = String.valueOf(dayNo);
					}
					daysButton[i][j].setText(s);
					if (s.equals("")) {
						daysButton[i][j].setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
						daysButton[i][j].setBorder(null);
					}
					else {
						daysButton[i][j].setCursor(new Cursor(Cursor.HAND_CURSOR));
						daysButton[i][j].setBorder(
								new LineBorder(Color.blue, 1, true));
					}
					dayNo++;
				}
			}
			dayColorUpdate(false);
		}
		
		public void stateChanged(ChangeEvent e) {
			dayColorUpdate(true);
			JSpinner source = (JSpinner) e.getSource();
			Calendar c = getCalendar();
			if (source.getName().equals("Year")) {
				c.set(Calendar.YEAR, getSelectedYear());
			}
			else {
				c.set(Calendar.MONTH, getSelectedMonth() - 1);
			}
			setDate(c.getTime());
			flushWeekAndDay();
		}

		public void actionPerformed(ActionEvent e) {
			JButton source = (JButton) e.getSource();
			if (source.getText().length() == 0)
				return;
			dayColorUpdate(true);
			int newDay = Integer.parseInt(source.getText());
			Calendar c = getCalendar();
			c.set(Calendar.DAY_OF_MONTH, newDay);
			setDate(c.getTime());
			dialog.dispose();
		}
		
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -