289 lines
8.4 KiB
289 lines
8.4 KiB
package com.fr.design.gui.date; |
|
|
|
import com.fr.base.FRContext; |
|
import com.fr.design.gui.icombobox.UIComboBox; |
|
import com.fr.design.gui.icombobox.UIComboBoxUI; |
|
import com.fr.design.layout.FRGUIPaneFactory; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
|
|
import javax.swing.*; |
|
import javax.swing.event.ChangeEvent; |
|
import javax.swing.event.ChangeListener; |
|
import javax.swing.plaf.ComboBoxUI; |
|
import javax.swing.plaf.basic.BasicComboPopup; |
|
import javax.swing.plaf.basic.ComboPopup; |
|
import java.awt.*; |
|
import java.awt.event.MouseEvent; |
|
import java.io.Serializable; |
|
import java.text.ParseException; |
|
import java.text.SimpleDateFormat; |
|
import java.util.Date; |
|
|
|
/** |
|
* UIDatePicker |
|
*/ |
|
public class UIDatePicker extends UIComboBox implements Serializable { |
|
/** |
|
* 日期格式类型 |
|
*/ |
|
public static final int STYLE_CN_DATE = 0; |
|
public static final int STYLE_CN_DATE1 = 1; |
|
public static final int STYLE_CN_DATETIME = 2; |
|
public static final int STYLE_CN_DATETIME1 = 3; |
|
public static final int STYLE_EN_DATE = 4; |
|
public boolean isWillHide = false; |
|
/** |
|
* 日期格式类型 |
|
*/ |
|
private int formatStyle = STYLE_CN_DATETIME; |
|
/** |
|
* 当前设置日期格式 |
|
*/ |
|
private SimpleDateFormat dateFormat = null; |
|
|
|
/** |
|
* 只有一个值的ComboBoxModel |
|
*/ |
|
private SingleObjectComboBoxModel model = new SingleObjectComboBoxModel(); |
|
JDateDocument dateDocument = null; |
|
|
|
/** |
|
* 构造式 |
|
*/ |
|
public UIDatePicker() throws UnsupportedOperationException { |
|
this(STYLE_CN_DATE); |
|
} |
|
|
|
public UIDatePicker(int formatStyle) throws UnsupportedOperationException { |
|
this(formatStyle, new Date()); |
|
} |
|
|
|
public UIDatePicker(int formatStyle, Date initialDatetime) throws UnsupportedOperationException { |
|
this.setStyle(formatStyle); |
|
//设置可编辑 |
|
this.setEditable(true); |
|
|
|
this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); |
|
|
|
//设置编辑器属性(只能输入正确日期) |
|
JTextField textField = ((JTextField) getEditor().getEditorComponent()); |
|
textField.setHorizontalAlignment(SwingConstants.CENTER); |
|
dateDocument = new JDateDocument(textField, this.dateFormat); |
|
textField.setDocument(dateDocument); |
|
//设置Model为单值Model |
|
this.setModel(model); |
|
//设置当前选择日期 |
|
this.setSelectedItem(initialDatetime == null ? new Date() : initialDatetime); |
|
updateUI(); |
|
} |
|
|
|
/** |
|
* 设置日期格式 |
|
* STYLE_CN_DATE |
|
* STYLE_CN_DATE1 |
|
* STYLE_CN_DATETIME |
|
* STYLE_CN_DATETIME1 |
|
* |
|
* @param formatStyle int |
|
*/ |
|
public void setStyle(int formatStyle) throws UnsupportedOperationException { |
|
this.formatStyle = formatStyle; |
|
dateFormat = getDateFormat(formatStyle); |
|
model.setDateFormat(dateFormat); |
|
if (dateDocument != null) { |
|
dateDocument.setDateFormat(dateFormat); |
|
} |
|
} |
|
|
|
/** |
|
* 取得指定类型的日期格式 |
|
* |
|
* @param formatStyle int |
|
* @return SimpleDateFormat |
|
* @throws UnsupportedOperationException |
|
*/ |
|
private static SimpleDateFormat getDateFormat(int formatStyle) throws |
|
UnsupportedOperationException { |
|
switch (formatStyle) { |
|
case STYLE_CN_DATE: |
|
return new SimpleDateFormat("yyyy/MM/dd"); |
|
case STYLE_CN_DATE1: |
|
return new SimpleDateFormat("yyyy-MM-dd"); |
|
case STYLE_CN_DATETIME: |
|
return new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); |
|
case STYLE_CN_DATETIME1: |
|
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|
case STYLE_EN_DATE: |
|
return new SimpleDateFormat("MM/dd/yyyy"); |
|
default: |
|
throw new UnsupportedOperationException( |
|
"invalid formatStyle parameter!"); |
|
} |
|
} |
|
|
|
/** |
|
* 取得日期格式 |
|
* STYLE_CN_DATE |
|
* STYLE_CN_DATE1 |
|
* STYLE_CN_DATETIME |
|
* STYLE_CN_DATETIME1 |
|
* |
|
* @return int |
|
*/ |
|
public int getStyle() { |
|
return formatStyle; |
|
} |
|
|
|
/** |
|
* 取得当前选择的日期 |
|
* |
|
* @return Date |
|
*/ |
|
public Date getSelectedDate() throws ParseException { |
|
synchronized (this) { |
|
return dateFormat.parse(getSelectedItem().toString()); |
|
} |
|
} |
|
|
|
/** |
|
* 设置当前选择的日期 |
|
*/ |
|
public void setSelectedDate(Date date) throws ParseException { |
|
this.setSelectedItem(dateFormat.format(date)); |
|
} |
|
|
|
public void setSelectedItem(Object anObject) { |
|
model.setSelectedItem(anObject); |
|
super.setSelectedItem(anObject); |
|
} |
|
|
|
/** |
|
* <p>Title: UIDatePicker</p> |
|
* <p>Description: DatePopup 选择框弹出的日期选择面板</p> |
|
* <p>Copyright: Copyright (c) 2004</p> |
|
* <p>Company: </p> |
|
* |
|
* @author <a href="mailto:sunkingxie@hotmail.com"'>Sunking</a> |
|
* @version 1.0 |
|
*/ |
|
class DatePopup extends BasicComboPopup implements ChangeListener { |
|
UICalendarPanel calendarPanel = null; |
|
|
|
public DatePopup(JComboBox box) { |
|
super(box); |
|
|
|
setLayout(FRGUIPaneFactory.createBorderLayout()); |
|
calendarPanel = new UICalendarPanel(formatStyle > 1); |
|
calendarPanel.addDateChangeListener(this); |
|
add(calendarPanel, BorderLayout.CENTER); |
|
setBorder(BorderFactory.createEmptyBorder()); |
|
} |
|
|
|
public void hide() { |
|
if (isWillHide) { |
|
super.hide(); |
|
} |
|
} |
|
|
|
public void show() { |
|
if (isWillHide || UIDatePicker.this.isEnabled() == false) { |
|
return; |
|
} |
|
if (calendarPanel != null) { |
|
calendarPanel.resetHMSPaneSelectedNumberField(); |
|
} |
|
super.show(); |
|
} |
|
|
|
/** |
|
* 显示弹出面板 |
|
*/ |
|
protected void firePropertyChange(String propertyName, |
|
Object oldValue, |
|
Object newValue) { |
|
if (ComparatorUtils.equals(propertyName, "visible")) { |
|
if (ComparatorUtils.equals(oldValue, Boolean.FALSE) |
|
&& ComparatorUtils.equals(newValue, Boolean.TRUE)) { //SHOW |
|
try { |
|
String strDate = comboBox.getSelectedItem().toString(); |
|
synchronized (this) { |
|
Date selectionDate = dateFormat.parse(strDate); |
|
calendarPanel.setSelectedDate(selectionDate); |
|
calendarPanel.updateHMS(); |
|
} |
|
} catch (Exception e) { |
|
FRContext.getLogger().error(e.getMessage(), e); |
|
} |
|
} else if (ComparatorUtils.equals(oldValue, Boolean.TRUE) |
|
&& ComparatorUtils.equals(newValue, Boolean.FALSE)) { //HIDE |
|
} |
|
} |
|
super.firePropertyChange(propertyName, oldValue, newValue); |
|
} |
|
|
|
public void stateChanged(ChangeEvent e) { |
|
if (calendarPanel.getSelectedDate() != null && dateFormat != null) { |
|
String strDate = dateFormat.format(calendarPanel.getSelectedDate()); |
|
if (comboBox.isEditable() && comboBox.getEditor() != null) { |
|
comboBox.configureEditor(comboBox.getEditor(), strDate); |
|
} |
|
comboBox.setSelectedItem(strDate); |
|
} |
|
comboBox.repaint(); |
|
setVisible(false); |
|
} |
|
} |
|
|
|
protected ComboBoxUI getUIComboBoxUI() { |
|
return new UIComboBoxUI() { |
|
protected ComboPopup createPopup() { |
|
return new DatePopup(comboBox); |
|
} |
|
|
|
public void mousePressed(MouseEvent e) { |
|
if (UIDatePicker.this.isPopupVisible()) { |
|
isWillHide = true; |
|
UIDatePicker.this.hidePopup(); |
|
} else { |
|
isWillHide = false; |
|
UIDatePicker.this.showPopup(); |
|
} |
|
} |
|
}; |
|
} |
|
|
|
|
|
|
|
//设置dataFormat |
|
public void setDateFormat(SimpleDateFormat format){ |
|
this.dateFormat = format; |
|
} |
|
|
|
//获取dateFormat |
|
public SimpleDateFormat getDateFormat(){ |
|
return this.dateFormat; |
|
} |
|
|
|
public JDateDocument getDateDocument(){ |
|
return this.dateDocument; |
|
} |
|
|
|
public static void main(String[] args) { |
|
LayoutManager layoutManager = null; |
|
JFrame jf = new JFrame("test"); |
|
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
|
JPanel content = (JPanel) jf.getContentPane(); |
|
content.setLayout(layoutManager); |
|
UIDatePicker bb = new UIDatePicker(); |
|
if (args.length != 0) { |
|
bb = new UIDatePicker(STYLE_CN_DATETIME); |
|
} |
|
bb.setEditable(true); |
|
bb.setBounds(20, 20, bb.getPreferredSize().width, bb.getPreferredSize().height); |
|
content.add(bb); |
|
GUICoreUtils.centerWindow(jf); |
|
jf.setSize(400, 400); |
|
jf.setVisible(true); |
|
} |
|
} |