📄 datechooser.java
字号:
/*
* DateChooser.java
*
* Created on 2007年8月22日, 下午6:07
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Stroke;
import java.awt.Toolkit;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.SwingUtilities;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
/**
*
* @author hadeslee
*/
public class DateChooser extends JPanel{
private Date initDate;
private Calendar now=Calendar.getInstance();
private Calendar select;
private JPanel monthPanel;//月历
private JP1 jp1;//四块面板,组成
private JP2 jp2;
private JP3 jp3;
private JP4 jp4;
private Font font=new Font("宋体",Font.PLAIN,12);
private final LabelManager lm=new LabelManager();
private JLabel showDate;//,toSelect;
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
private boolean isShow=false;
private Popup pop;
/**
* Creates a new instance of DateChooser
*/
public DateChooser() {
this(new Date());
}
public DateChooser(Date date){
initDate=date;
select=Calendar.getInstance();
select.setTime(initDate);
initPanel();
initLabel();
}
public void setEnabled(boolean b){
super.setEnabled(b);
showDate.setEnabled(b);
}
/**
*得到当前选择框的日期
*/
public Date getDate(){
return select.getTime();
}
//根据初始化的日期,初始化面板
private void initPanel(){
monthPanel=new JPanel(new BorderLayout());
monthPanel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
JPanel up=new JPanel(new BorderLayout());
up.add(jp1=new JP1(),BorderLayout.NORTH);
up.add(jp2=new JP2(),BorderLayout.CENTER);
monthPanel.add(jp3=new JP3(),BorderLayout.CENTER);
monthPanel.add(up,BorderLayout.NORTH);
monthPanel.add(jp4=new JP4(),BorderLayout.SOUTH);
this.addAncestorListener(new AncestorListener(){
public void ancestorAdded(AncestorEvent event) {
}
public void ancestorRemoved(AncestorEvent event) {
}
//只要祖先组件一移动,马上就让popup消失
public void ancestorMoved(AncestorEvent event) {
hidePanel();
}
});
}
//初始化标签
private void initLabel(){
showDate=new JLabel(sdf.format(initDate));
showDate.setRequestFocusEnabled(true);
showDate.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent me){
showDate.requestFocusInWindow();
}
});
// toSelect=new JLabel(sdf.format(initDate));
// toSelect.setBorder(BorderFactory.createLineBorder(Color.BLACK));
// toSelect.setRequestFocusEnabled(true);
this.setBackground(Color.WHITE);
this.add(showDate,BorderLayout.CENTER);
// this.add(toSelect,BorderLayout.EAST);
this.setPreferredSize(new Dimension(90,25));
this.setBorder(BorderFactory.createLineBorder(Color.GRAY));
showDate.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
if(showDate.isEnabled()){
showDate.setCursor(new Cursor(Cursor.HAND_CURSOR));
showDate.setForeground(Color.RED);
}
}
public void mouseExited(MouseEvent me){
if(showDate.isEnabled()){
showDate.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
showDate.setForeground(Color.BLACK);
}
}
public void mousePressed(MouseEvent me){
if(showDate.isEnabled()){
showDate.setForeground(Color.CYAN);
if(isShow){
hidePanel();
}else{
showPanel(showDate);
}
}
}
public void mouseReleased(MouseEvent me){
if(showDate.isEnabled()){
showDate.setForeground(Color.BLACK);
}
}
});
showDate.addFocusListener(new FocusListener(){
public void focusLost(FocusEvent e){
hidePanel();
}
public void focusGained(FocusEvent e){
}
});
}
//根据新的日期刷新
private void refresh(){
jp1.updateDate();
jp3.updateDate();
SwingUtilities.updateComponentTreeUI(this);
}
//提交日期
private void commit(){
System.out.println("选中的日期是:"+sdf.format(select.getTime()));
showDate.setText(sdf.format(select.getTime()));
hidePanel();
}
private void hidePanel(){
if(pop!=null){
isShow=false;
pop.hide();
pop=null;
}
}
private void showPanel(Component owner){
if(pop!=null){
pop.hide();
}
Point show=new Point(0,showDate.getHeight());
SwingUtilities.convertPointToScreen(show,showDate);
Dimension size=Toolkit.getDefaultToolkit().getScreenSize();
int x=show.x;
int y=show.y;
if(x<0){
x=0;
}
if(x>size.width-295){
x=size.width-295;
}
if(y<size.height-170){
}else{
y-=188;
}
pop=PopupFactory.getSharedInstance().getPopup(owner,monthPanel,x,y);
pop.show();
isShow=true;
}
private class JP1 extends JPanel{
JLabel left,right,center;
public JP1(){
super(new BorderLayout());
this.setBackground(new Color(160,185,215));
initJP1();
}
private void initJP1(){
left=new JLabel(" << ",JLabel.CENTER);
left.setToolTipText("上一月");
right=new JLabel(" >> ",JLabel.CENTER);
right.setToolTipText("下一月");
left.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
right.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
center=new JLabel("",JLabel.CENTER);
updateDate();
this.add(left,BorderLayout.WEST);
this.add(center,BorderLayout.CENTER);
this.add(right,BorderLayout.EAST);
this.setPreferredSize(new Dimension(295,25));
left.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
left.setCursor(new Cursor(Cursor.HAND_CURSOR));
left.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
left.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
left.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
select.add(Calendar.MONTH,-1);
left.setForeground(Color.WHITE);
refresh();
}
public void mouseReleased(MouseEvent me){
left.setForeground(Color.BLACK);
}
});
right.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
right.setCursor(new Cursor(Cursor.HAND_CURSOR));
right.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
right.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
right.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
select.add(Calendar.MONTH,1);
right.setForeground(Color.WHITE);
refresh();
}
public void mouseReleased(MouseEvent me){
right.setForeground(Color.BLACK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -