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

📄 datechooser.java

📁 JADE实例——多Agent系统展示(图书交易系统)
💻 JAVA
字号:
package bookTrading.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * 日期时间选择控件
 * <p>
 * usage:
 * <pre>
 * ......
 * DateChooser dateChooser = null;
 * ...... 
 * DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 * JFormattedTextField deadlineField = new JFormattedTextField(dateFormat);
 * ......
 * JButton b = new JButton("Set");
 * b.addActionListener(new ActionListener() {
 * 	public void actionPerformed(ActionEvent ev) {
 * 		if (dateChooser == null) {
 * 			dateChooser = new DateChooser(deadlineField);
 * 		}
 * 		Point p = getLocationOnScreen();
 * 		p.y = p.y+30;
 * 		dateChooser.showDialog("DateTime Chooser", p);
 * 	}
 * });
 * </pre>
 * @author 刘文俊 
 * 
 */
public class DateChooser extends JPanel implements ActionListener, ChangeListener {
	
	public DateChooser(JFormattedTextField dateField) {
		this.dateField = dateField;
		setLayout(new BorderLayout());
		setBorder(new LineBorder(backGroundColor, 2));
		setBackground(backGroundColor);
		
		calendar = GregorianCalendar.getInstance();

		JPanel topYearAndMonth = createYMHMSPanel();
		add(topYearAndMonth, BorderLayout.NORTH);
		JPanel centerWeekAndDay = createWeekAndDayPanel();
		add(centerWeekAndDay, BorderLayout.CENTER);		
	}
	
	private JPanel createYMHMSPanel(){		
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());
		panel.setBackground(controlLineColor);

		int currentYear = calendar.get(Calendar.YEAR);
		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); 
		panel.add(yearSpin);

		JLabel yearLabel = new JLabel("Year");
		yearLabel.setForeground(controlTextColor);
		panel.add(yearLabel);

		int currentMonth = calendar.get(Calendar.MONTH) + 1;
		monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth,
				1, 12, 1));
		monthSpin.setPreferredSize(new Dimension(35, 20));
		monthSpin.setName("Month");
		monthSpin.addChangeListener(this); 
		panel.add(monthSpin);

		JLabel monthLabel = new JLabel("Month");
		monthLabel.setForeground(controlTextColor);
		panel.add(monthLabel);
		
		int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
		hourSpin = new JSpinner(new SpinnerNumberModel(currentHour,
				0, 23, 1));
		hourSpin.setPreferredSize(new Dimension(35, 20));
		hourSpin.setName("Hour");
		hourSpin.addChangeListener(this); 
		panel.add(hourSpin);
		
		JLabel seperatorLabel = new JLabel(":");
		seperatorLabel.setForeground(controlTextColor);
		panel.add(seperatorLabel);
		
		int currentMinute = calendar.get(Calendar.MINUTE);
		minuteSpin = new JSpinner(new SpinnerNumberModel(currentMinute,
				0, 59, 1));
		minuteSpin.setPreferredSize(new Dimension(35, 20));
		minuteSpin.setName("Minute");
		minuteSpin.addChangeListener(this);
		panel.add(minuteSpin);
		
		seperatorLabel = new JLabel(":");
		seperatorLabel.setForeground(controlTextColor);
		panel.add(seperatorLabel);
		
		int currentSecond = calendar.get(Calendar.SECOND);
		secondSpin = new JSpinner(new SpinnerNumberModel(currentSecond,
				0, 59, 1));
		secondSpin.setPreferredSize(new Dimension(35, 20));
		secondSpin.setName("Second");
		secondSpin.addChangeListener(this);
		panel.add(secondSpin);
		
		return panel;
	}
	
	private JPanel createWeekAndDayPanel() {
		String colname[] = {"SUN", "MON", "TUE",
				"WEN", "THU", "FRI", "SAT"};
		JPanel panel = new JPanel();
		// 设置固定字体,以免调用环境改变影响界面美观
		panel.setFont(new Font("SansSerif", Font.PLAIN, 12));
		panel.setLayout(new GridLayout(7, 7));
		panel.setBackground(Color.white);
		JLabel cell = null;

		for(int i = 0; i < 7; i++) {
			cell = new JLabel(colname[i]);
			cell.setHorizontalAlignment(JLabel.RIGHT);
			if (i == 0 || i == 6)
				cell.setForeground(weekendFontColor);
			else
				cell.setForeground(weekFontColor);
			panel.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.RIGHT);
				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;
				panel.add(numberButton);
				actionCommandId++;
			}
		}

		return panel; 
	}
	
	private JDialog createDialog(String title) {
		Window window = SwingUtilities.getWindowAncestor(dateField);
		
		JDialog dialog = null;
		if (window instanceof Frame) {
			dialog = new DateChooserDialog(this, (Frame)window, title);
		} else {
			dialog = new DateChooserDialog(this, (Dialog)window, title);
		}
		
		dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
		dialog.getContentPane().add(this, BorderLayout.CENTER);
		dialog.pack();
		dialog.setSize(width, height);
		
		return dialog;
	}
	
	Point getAppropriateLocation(Frame 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;
	}
	
	void setDateField() {
		dateField.setValue(calendar.getTime());
	}
	
	public void showDialog(String title, Point position) {
		Frame owner =(Frame)SwingUtilities.getWindowAncestor(dateField);
		if (dialog == null || dialog.getOwner()!= owner)
			dialog = createDialog(title);
		dialog.setLocation(getAppropriateLocation(owner, position));
		
		flushCalendar();
		
		dialog.setVisible(true);
	}
	
	private void flushCalendar() {
		calendar.setTime((Date)dateField.getValue());
		
		int currentYear = calendar.get(Calendar.YEAR);
		yearSpin.setValue(currentYear);
		int currentMonth = calendar.get(Calendar.MONTH) + 1;
		monthSpin.setValue(currentMonth);
		int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
		hourSpin.setValue(currentHour);
		int currentMinute = calendar.get(Calendar.MINUTE);
		minuteSpin.setValue(currentMinute);
		int currentSecond = calendar.get(Calendar.SECOND);
		secondSpin.setValue(currentSecond);
		
		dayColorUpdate(true);
		flushWeekAndDay();
	}
	
	private void dayColorUpdate(boolean isOldDay) {
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		int actionCommandId = day - 2 + calendar.get(Calendar.DAY_OF_WEEK);
		calendar.set(Calendar.DAY_OF_MONTH, day);
		
		int i = actionCommandId / 7;
		int j = actionCommandId % 7;
		if (isOldDay == true) {
			if (j == 0 || j == 6)
				daysButton[i][j].setForeground(weekendFontColor);
			else
				daysButton[i][j].setForeground(dateFontColor);
		}
		else
			daysButton[i][j].setForeground(todayBackColor);
	}
	
	private void flushWeekAndDay() {
		int day = calendar.get(Calendar.DAY_OF_MONTH);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		int maxDayNo = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		int dayNo = 2 - calendar.get(Calendar.DAY_OF_WEEK);
		calendar.set(Calendar.DAY_OF_MONTH, day);
		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);
				dayNo++;
			}
		}
		
		dayColorUpdate(false);
	}
	
	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 int getSelectedMinute() {
		return ((Integer)minuteSpin.getValue()).intValue();
	}
	
	private int getSelectedSecond() {
		return ((Integer)secondSpin.getValue()).intValue();
	}
	
	public void stateChanged(ChangeEvent e) {
		JSpinner source =(JSpinner)e.getSource() ;
		
		if (source.getName().equals("Second")) {
			calendar.set(Calendar.SECOND, getSelectedSecond());
			return;
		}
		if (source.getName().equals("Minute")) {
			calendar.set(Calendar.MINUTE, getSelectedMinute());
			return;
		}
		if (source.getName().equals("Hour")) {
			calendar.set(Calendar.HOUR_OF_DAY, getSelectedHour());
			return;
		}
		
		dayColorUpdate(true);

		if (source.getName().equals("Year"))
			calendar.set(Calendar.YEAR, getSelectedYear());
		else
			calendar.set(Calendar.MONTH, getSelectedMonth() - 1);
		
		flushWeekAndDay();
	}
	
	public void actionPerformed(ActionEvent e) {
		JButton source =(JButton)e.getSource() ;
		if (source.getText().length() == 0)
			return;
		
		dayColorUpdate(true);
		source.setForeground(todayBackColor);
		
		int newDay = Integer.parseInt(source.getText());
		calendar.set(Calendar.DAY_OF_MONTH, newDay);		
	}
	
	int startYear = 1980;	// 默认【最小】显示年份
	int lastYear = 2050;	// 默认【最大】显示年份
	int width = 320;		// 界面宽度
	int height = 200;		// 界面高度

	Color backGroundColor = Color.gray;		// 底色
	// 月历表格配色----------------//
	Color palletTableColor = Color.white;	// 日历表底色
	Color todayBackColor = Color.orange;	// 今天背景色
	Color weekFontColor = Color.blue;		// 星期文字色
	Color dateFontColor = Color.black;		// 日期文字色
	Color weekendFontColor = Color.red;		// 周末文字色

	// 控制条配色------------------//
	Color controlLineColor = Color.pink;	// 控制条底色
	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;
	JButton[][] daysButton = new JButton[6][7];
	JSpinner hourSpin;
	JSpinner minuteSpin;
	JSpinner secondSpin;	
	
	Calendar calendar = null;
	JFormattedTextField dateField;
	
	
	private class DateChooserDialog extends JDialog {
		DateChooserDialog(DateChooser dateChooser, Frame frame, String title) {
			super(frame, title, true);
			this.dateChooser = dateChooser;
		}
		
		DateChooserDialog(DateChooser dateChooser, Dialog dialog, String title) {
			super(dialog, title, true);
			this.dateChooser = dateChooser;
		}
		
		public void hide() {
			dateChooser.setDateField();
			super.hide();			
		}
		
		private DateChooser dateChooser;
	}
}

⌨️ 快捷键说明

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