`
lbfhappy
  • 浏览: 83095 次
社区版块
存档分类
最新评论

日期选择器

阅读更多
JAVA好虽好,但是控件却总比MS的少.比如很常用的日期选择器和字体选择器,JDK就没有自带,怎么办呢,只有自己写一个了.希望对大家有一定的帮助.
<!---->/*
 * DateChooser.java
 *
 * Created on 2007年8月20日, 下午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);
                }
            });
        }
        
private void updateDate(){
            center.setText(select.get(Calendar.YEAR)
+""+(select.get(Calendar.MONTH)+1)+"");
        }
    }
    
private class JP2 extends JPanel{
        
public JP2(){
            
this.setPreferredSize(new Dimension(295,20));
        }
        
protected void paintComponent(Graphics g){
            g.setFont(font);
            g.drawString(
"星期日 星期一 星期二 星期三 星期四 星期五 星期六",5,10);
            g.drawLine(
0,15,getWidth(),15);
        }
    }
    
private class JP3 extends JPanel{
        
public JP3(){
            
super(new GridLayout(6,7));
            
this.setPreferredSize(new Dimension(295,100));
            initJP3();
        }
        
private void initJP3(){
            updateDate();
        }
        
public void updateDate(){
            
this.removeAll();
            lm.clear();
            Date temp
=select.getTime();
            Calendar select
=Calendar.getInstance();
            select.setTime(temp);
            select.set(Calendar.DAY_OF_MONTH,
1);
            
int index=select.get(Calendar.DAY_OF_WEEK);
            
int sum=(index==1?8:index);
            select.add(Calendar.DAY_OF_MONTH,
0-sum);
            
for(int i=0;i<42;i++){
                select.add(Calendar.DAY_OF_MONTH,
1);
                lm.addLabel(
new MyLabel(select.get(Calendar.YEAR),
                        select.get(Calendar.MONTH),select.get(Calendar.DAY_OF_MONTH)));
            }
            
for(MyLabel my:lm.getLabels()){
                
this.add(my);
            }
            select.setTime(temp);
        }
    }
    
private class MyLabel extends JLabel implements Comparator<MyLabel>,
            MouseListener,MouseMotionListener{
        
private int year,month,day;
        
private boolean isSelected;
        
public MyLabel(int year,int month,int day){
            
super(""+day,JLabel.CENTER);
            
this.year=year;
            
this.day=day;
            
this.month=month;
            
this.addMouseListener(this);
            
this.addMouseMotionListener(this);
            
this.setFont(font);
            
if(month==select.get(Calendar.MONTH)){
                
this.setForeground(Color.BLACK);
            }
else{
                
this.setForeground(Color.LIGHT_GRAY);
            }
            
if(day==select.get(Calendar.DAY_OF_MONTH)){
                
this.setBackground(new Color(160,185,215));
            }
else{
                
this.setBackground(Color.WHITE);
            }
        }
        
public boolean getIsSelected(){
            
return isSelected;
        }
        
public void setSelected(boolean b,boolean isDrag){
            isSelected
=b;
            
if(b&&!isDrag){
                
int temp=select.get(Calendar.MONTH);
                select.set(year,month,day);
                
if(temp==month){
                    SwingUtilities.updateComponentTreeUI(jp3);
                }
else{
                    refresh();
                }
            }
            
this.repaint();
        }
        
protected void paintComponent(Graphics g){
            
if(day==select.get(Calendar.DAY_OF_MONTH)&&
                    month
==select.get(Calendar.MONTH)){
                
//如果当前日期是选择日期,则高亮显示
                g.setColor(new Color(160,185,215));
                g.fillRect(
0,0,getWidth(),getHeight());
            }
            
if(year==now.get(Calendar.YEAR)&&
                    month
==now.get(Calendar.MONTH)&&
                    day
==now.get(Calendar.DAY_OF_MONTH)){
                
//如果日期和当前日期一样,则用红框
                Graphics2D gd=(Graphics2D)g;
                gd.setColor(Color.RED);
                Polygon p
=new Polygon();
                p.addPoint(
0,0);
                p.addPoint(getWidth()
-1,0);
                p.addPoint(getWidth()
-1<
分享到:
评论
1 楼 muqingren 2009-09-27  
貌似没有贴完啊

相关推荐

    web端 日期选择器 月份选择器 时间选择器 时间范围选择器

    本文将详细讲解"web端日期选择器、月份选择器、时间选择器以及时间范围选择器"这四个核心知识点,并结合提供的文件名称进行分析。 1. **日期选择器** 日期选择器是Web应用中常见的组件,用于让用户选择一个具体的...

    Android自定义日期选择器源码

    因此,开发者经常需要自定义日期选择器来提供更符合应用风格或特定功能的交互体验。这篇内容将深入探讨如何在Android中创建一个自定义日期选择器,并通过源码分析来增强我们的理解。 首先,我们要明白自定义日期...

    jsp日期选择器开发技术- Web开发

    日期选择器是Web应用程序中不可或缺的组件,它允许用户方便地选取日期,常见于表单输入、日程安排等场景。本教程将重点探讨如何在JSP中实现日期选择器的开发技术。 首先,我们需要理解JSP中的基本概念。JSP是由HTML...

    基于jquery的H5移动端选择器,日期选择器,自定义级联选择器,自定义html选择器

    基于jQuery的H5移动端日期选择器可以提供直观、易用的用户界面,支持触摸操作,并能根据手机屏幕尺寸进行适配。通常,这样的选择器会包含年、月、日的滑动选择或者下拉菜单,使得用户可以快速、准确地设定日期,避免...

    easyui 日期选择器

    EasyUI 提供了一些事件来监听日期选择器的操作,如`onOpen`(打开日期选择器时触发)、`onClose`(关闭日期选择器时触发)等。开发者可以根据需求编写相应的事件处理函数。 ```html (date){console.log('选中的日期...

    实现了Android开发自定义年月日日期选择器,时分时间选择器

    本话题主要探讨如何实现自定义的年月日日期选择器和时分时间选择器,这两个组件在许多应用程序中都非常常见,例如在事件安排、预约服务或者设置提醒等功能中。 首先,我们来看如何创建自定义的年月日日期选择器。这...

    利用css+javascript实现的一个日期选择器代码

    【标题】:“利用css+javascript实现的一个日期选择器代码”涉及的核心知识点主要集中在CSS样式设计和JavaScript编程上,用于创建一个交互式的日期选择组件。日期选择器是网页表单中常见的一种元素,允许用户方便地...

    仿iphone日期选择器,开始时间和结束时间选择

    标题中的"仿iPhone日期选择器,开始时间和结束时间选择"指的是创建一个UI组件,它模仿了苹果设备上的日期选择器,并允许用户分别选择开始日期和结束日期。 苹果原生的日期选择器(UIDatePicker)通常只能单独选择一...

    jQuery datepicker 日期选择器 中文汉化版 开始日期结束日期

    jQuery UI的日期选择器(jQuery datepicker)是一个广泛使用的组件,尤其在网页表单中用于输入日期时。这个组件提供了一个优雅、用户友好的界面,允许用户通过日历视图来选择日期,而不是手动输入。在中文环境中,...

    基于wheelView的自定义日期选择器

    "基于WheelView的自定义日期选择器"就是一个很好的示例,它利用了WheelView这一滚动视图组件来实现用户友好的日期选择功能。这篇内容将深入探讨如何构建这样的选择器,以及其在Android开发中的应用和扩展性。 首先...

    js日期选择器

    JavaScript日期选择器是一种常见的网页交互元素,用于帮助用户在网页上方便地选取日期。它通常以日历形式呈现,提供友好的用户界面,使得输入日期变得更加直观和简单。在前端开发中,尤其对于需要用户输入特定日期的...

    前端easyUI日期选择器(日/周/月)示例

    前端jquery+easyUI实现的日期选择器。 博文地址:https://blog.csdn.net/wanghuiWHI/article/details/135648572 Demo简要: 1.日期选择器可以提供日选择器、周选择器、月选择器 2.日选择器最大31天,选择起始日期后...

    swift-DatePicker日期选择器日期时间选择时间选择器

    `Zws-China-DatePicker-d62d652`可能是某个第三方Swift库,它可能提供了更高级的功能,如自定义日期选择器的外观,或者为中国用户优化的日期格式等。在实际项目中,使用这类库可以简化开发工作并提升用户体验。具体...

    EXCELVBA 日期选择器加载项

    标题 "EXCELVBA 日期选择器加载项" 指的是在Excel中使用VBA(Visual Basic for Applications)创建的一个特殊功能,它允许用户通过一个交互式的日期选择面板来方便地选择日期,而无需手动输入。这个加载项通常集成在...

    带有开始时间和结束时间的日期选择器

    在Android开发中,日期选择器是用户界面中常见的组件,用于让用户方便地选取特定的日期或时间。"带有开始时间和结束时间的日期选择器"是一个DEMO项目,它专为Android Studio设计,允许用户同时选择一个起始日期和...

    jquery移动端日期选择器

    "jquery移动端日期选择器"就是为了解决这个问题而设计的,它提供了一个友好、便捷的日期选取体验,特别适用于触屏设备。这个插件使得用户在手机或平板上选择日期时不再需要手动输入复杂的日期格式,从而提高用户体验...

    一个移动端react的日期选择器

    在移动端应用开发中,UI组件的选择器扮演着至关重要的角色,特别是日期选择器,它能够帮助用户方便地选取和输入日期。React作为一个流行的JavaScript库,为开发者提供了丰富的组件生态系统,其中包括了专门用于...

    日期选择器插件(一共五个在)

    日期选择器插件是前端开发中常用的一种组件,主要用于用户在网页上方便地选取日期或时间范围。在本文中,我们将深入探讨五个不同的日期选择器插件,它们各自的特点、功能以及如何在项目中集成和使用。 1. **...

Global site tag (gtag.js) - Google Analytics