`
lushuaiyin
  • 浏览: 705120 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

swing 一个日期选择器

 
阅读更多

package give;

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;

/**
* @auther 卢帅印
* @date 2011-09-01
* 日期选择器,可以指定日期的显示格式
*/
public class DateChooser extends JPanel{

private static final long serialVersionUID = 4529266044762990227L;

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;
private boolean isShow=false;
private Popup pop;

String dateStr;

/**
* Creates a new instance of DateChooser
*/
public DateChooser() {
this(new Date());
}
public DateChooser(Date date){
this(date, "yyyy年MM月dd日");
}
public DateChooser(String format){
this(new Date(), format);
}
public DateChooser(Date date, String format){
initDate=date;
sdf=new SimpleDateFormat(format);
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()));

dateStr=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 yearleft,yearright,monthleft,monthright,center,centercontainer;
public JP1(){
super(new BorderLayout());
this.setBackground(new Color(160,185,215));
initJP1();
}
private void initJP1(){
yearleft=new JLabel(" <<",JLabel.CENTER);
yearleft.setToolTipText("上一年");
yearright=new JLabel(">> ",JLabel.CENTER);
yearright.setToolTipText("下一年");
yearleft.setBorder(BorderFactory.createEmptyBorder(2,0,0,0));
yearright.setBorder(BorderFactory.createEmptyBorder(2,0,0,0));

monthleft=new JLabel(" <", JLabel.RIGHT);
monthleft.setToolTipText("上一月");
monthright=new JLabel("> ", JLabel.LEFT);
monthright.setToolTipText("下一月");
monthleft.setBorder(BorderFactory.createEmptyBorder(2,30,0,0));
monthright.setBorder(BorderFactory.createEmptyBorder(2,0,0,30));

centercontainer=new JLabel("", JLabel.CENTER);
centercontainer.setLayout(new BorderLayout());
center=new JLabel("", JLabel.CENTER);

centercontainer.add(monthleft,BorderLayout.WEST);
centercontainer.add(center,BorderLayout.CENTER);
centercontainer.add(monthright,BorderLayout.EAST);

this.add(yearleft,BorderLayout.WEST);
this.add(centercontainer,BorderLayout.CENTER);
this.add(yearright,BorderLayout.EAST);
this.setPreferredSize(new Dimension(295,25));

updateDate();

yearleft.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
yearleft.setCursor(new Cursor(Cursor.HAND_CURSOR));
yearleft.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
yearleft.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
yearleft.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
select.add(Calendar.YEAR,-1);
yearleft.setForeground(Color.WHITE);
refresh();
}
public void mouseReleased(MouseEvent me){
yearleft.setForeground(Color.BLACK);
}
});
yearright.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
yearright.setCursor(new Cursor(Cursor.HAND_CURSOR));
yearright.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
yearright.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
yearright.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
select.add(Calendar.YEAR,1);
yearright.setForeground(Color.WHITE);
refresh();
}
public void mouseReleased(MouseEvent me){
yearright.setForeground(Color.BLACK);
}
});
monthleft.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
monthleft.setCursor(new Cursor(Cursor.HAND_CURSOR));
monthleft.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
monthleft.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
monthleft.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
select.add(Calendar.MONTH,-1);
monthleft.setForeground(Color.WHITE);
refresh();
}
public void mouseReleased(MouseEvent me){
monthleft.setForeground(Color.BLACK);
}
});
monthright.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
monthright.setCursor(new Cursor(Cursor.HAND_CURSOR));
monthright.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
monthright.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
monthright.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
select.add(Calendar.MONTH,1);
monthright.setForeground(Color.WHITE);
refresh();
}
public void mouseReleased(MouseEvent me){
monthright.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,getHeight()-1);
p.addPoint(0,getHeight()-1);
gd.drawPolygon(p);
}
if(isSelected){//如果被选中了就画出一个虚线框出来
Stroke s=new BasicStroke(1.0f,BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_BEVEL,1.0f,new float[]{2.0f,2.0f},1.0f);
Graphics2D gd=(Graphics2D)g;
gd.setStroke(s);
gd.setColor(Color.BLACK);
Polygon p=new Polygon();
p.addPoint(0,0);
p.addPoint(getWidth()-1,0);
p.addPoint(getWidth()-1,getHeight()-1);
p.addPoint(0,getHeight()-1);
gd.drawPolygon(p);
}
super.paintComponent(g);
}
public boolean contains(Point p){
return this.getBounds().contains(p);
}
private void update(){
repaint();
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
isSelected=true;
update();
}
public void mouseReleased(MouseEvent e) {
Point p=SwingUtilities.convertPoint(this,e.getPoint(),jp3);
lm.setSelect(p,false);
commit();
}
public void mouseEntered(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
Point p=SwingUtilities.convertPoint(this,e.getPoint(),jp3);
lm.setSelect(p,true);
}
public void mouseMoved(MouseEvent e) {
}
public int compare(MyLabel o1, MyLabel o2) {
Calendar c1=Calendar.getInstance();
c1.set(o1.year,o2.month,o1.day);
Calendar c2=Calendar.getInstance();
c2.set(o2.year,o2.month,o2.day);
return c1.compareTo(c2);
}
}
private class LabelManager{
private List<MyLabel> list;
public LabelManager(){
list=new ArrayList<MyLabel>();
}
public List<MyLabel> getLabels(){
return list;
}
public void addLabel(MyLabel my){
list.add(my);
}
public void clear(){
list.clear();
}
public void setSelect(MyLabel my, boolean b){
for(MyLabel m:list){
if(m.equals(my)){
m.setSelected(true,b);
}else{
m.setSelected(false,b);
}
}
}
public void setSelect(Point p, boolean b){
//如果是拖动,则要优化一下,以提高效率
if(b){
//表示是否能返回,不用比较完所有的标签,能返回的标志就是把上一个标签和
//将要显示的标签找到了就可以了
boolean findPrevious=false,findNext=false;
for(MyLabel m:list){
if(m.contains(p)){
findNext=true;
if(m.getIsSelected()){
findPrevious=true;
}else{
m.setSelected(true,b);
}
}else if(m.getIsSelected()){
findPrevious=true;
m.setSelected(false,b);
}
if(findPrevious&&findNext){
return;
}
}
}else{
MyLabel temp=null;
for(MyLabel m:list){
if(m.contains(p)){
temp=m;
}else if(m.getIsSelected()){
m.setSelected(false,b);
}
}
if(temp!=null){
temp.setSelected(true,b);
}
}
}

}
private class JP4 extends JPanel{
public JP4(){
super(new BorderLayout());
this.setPreferredSize(new Dimension(295,20));
this.setBackground(new Color(160,185,215));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");

dateStr="今天: "+sdf.format(new Date());


final JLabel jl=new JLabel("今天: "+sdf.format(new Date()));
jl.setToolTipText("点击选择今天日期");
this.add(jl,BorderLayout.CENTER);
jl.addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent me){
jl.setCursor(new Cursor(Cursor.HAND_CURSOR));
jl.setForeground(Color.RED);
}
public void mouseExited(MouseEvent me){
jl.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
jl.setForeground(Color.BLACK);
}
public void mousePressed(MouseEvent me){
jl.setForeground(Color.WHITE);
select.setTime(new Date());
refresh();
commit();
}
public void mouseReleased(MouseEvent me){
jl.setForeground(Color.BLACK);
}
});
}
}

public static void main(String[] args) {
final DateChooser mp = new DateChooser("yyyy-MM-dd");
JFrame jf = new JFrame("测试日期选择器");
jf.add(mp, BorderLayout.CENTER);
jf.add(new JButton("测试用的"),BorderLayout.NORTH);
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

//////////////////////////////使用方法///////////////////////////////////

在其他窗口中,比如new出来的frame,可以先声明DateChooser mp;

在构造函数中实例化它;

在事件中可以获取它的值的方法,例如:

private void jButton0MouseMouseClicked(MouseEvent event) {
//获取dateChooser的值通过获取实例的dateStr(它在实例每次改变后也跟着改变)
//我没通过调用此组件的系统方法去获取值,目前找不到方法,这样更简单
String value=mp.dateStr;

System.out.println("value change:"+value);
jTextField1.setText(value);
}

////这样mp.dateStr就是每次获取日期的值,你想拿它来做什么都可以

分享到:
评论

相关推荐

    Java实现日期选择,一个简单的Java Swing时间日期选择控件的代码示例,带有中文注释

    代码创建了一个简单的Java Swing时间日期选择器,包含一个输入框、一个按钮和一个日期标签。 当点击按钮时,会获取当前时间日期并显示在输入框中。 用户可以在输入框中输入或选择一个日期。 该代码使用了Java ...

    java swing 时间日期选择控件

    JCalendar包含一个日历面板和一个日期选择器,用户可以通过点击日、周、月或年视图来选择日期。它还支持日期范围选择、日期格式化以及多语言环境。 2. **JDatePicker**: 这是SwingX库中的一个组件,它提供了一个...

    swing 日期选择控件

    尽管Swing自身没有内建的日期选择器,但通过扩展JFrame、JPanel等基本组件以及利用其他类库,可以创建自定义的日期选择控件。 在提供的描述中提到了"包含库文件和资源文件",这意味着这个压缩包可能包含了一个完整...

    Swing Datepicker时间选择器jar包

    此外,由于Swing库是跨平台的,所以这个日期选择器可以在Windows、Linux和macOS等不同操作系统上保持一致的外观和行为。 总的来说,Swing Datepicker是一个增强Java Swing应用程序日期选择功能的重要组件,它的封装...

    swing 日期选择器 支持点击文本框选择 和自定义按钮选择

    swing 日期选择器 支持点击文本框选择 和自定义按钮选择

    JAVA Swing日期选择控件datepicker

    `datepicker.jar` 文件很可能就是一个包含DatePicker组件的第三方库,它可能包含了预定义的DatePicker类和相关方法,以便开发者在Swing应用中轻松集成日期选择功能。为了使用这个库,你需要将其添加到项目的类路径中...

    JAVA Swing日期选择控件datepicker的使用

    1. 添加依赖:为了在Swing应用中使用DatePicker,可以引入JCalendar库,这是一个包含日期选择器组件的第三方库。将JCalendar的jar文件添加到项目的类路径中。 2. 引入组件:在程序中导入JCalendar的相关类,例如`...

    日期选择器java源码

    本资源提供了一个经典且具有高度通用性和复用性的日期选择器源码,允许开发者根据需求进行二次修改和定制。 日期选择器的核心功能包括: 1. **日期展示与选择**:通常,日期选择器会以日历的形式展示日期,用户...

    java Swing日期控件

    `DatePicker.jar` 文件很可能包含了一个定制的日期选择器组件,可能是开发者为了增强原生 Swing 的日期选择功能而创建的一个库。这种自定义控件通常会提供更多的自定义选项、样式调整和事件处理能力,以满足特定项目...

    java做的日期选择器Demo

    本Demo展示了如何在Java环境下实现一个日期选择器功能。这个特定的Demo已经在Win7 64位系统上成功运行并通过了测试,这意味着它具有良好的平台兼容性。在工程应用中,只需将包含该功能的单一Java文件复制到项目中...

    java swing 日期控件

    `JDateChooser` 是Toedter Components库中的一个日期选择器,它提供了一个包含日历小部件的`JPanel`。用户可以通过点击日历图标来选择日期。你可以通过以下方式创建`JDateChooser`: ```java import ...

    swing的日期选择控件

    `JCalendar`通常会与`JDatePicker`结合使用,`JDatePicker`是一个简单的日期选择器,它可以作为一个独立的组件或与`JFormattedTextField`一起使用,以展示和编辑日期值。 描述中提及的"DatePicker"是Swing中实现...

    Swing 日期控件(包含源代码)

    Swing本身并不直接提供一个内置的日期选择器,但开发者通常会使用JCalendar或者自定义组件来实现这一功能。在这个案例中,作者发现了一个网上现有的日期组件,并对其进行了优化,以满足更好的用户体验或特定需求。 ...

    Java日期选择器Swing写的,可以指定日期的显示格式

    Java日期选择器Swing写的,可以指定日期的显示格式 ,不支持时间选择,用来学习还是不错的

    时间日期选择器

    - 时间日期选择器通常会监听用户的交互,当用户选择一个日期时,会触发一个事件。开发者可以注册事件处理器来响应这些事件,获取用户选择的日期,并进行后续处理。 - 使用`ActionListener`或JavaFX的`EventHandler...

    Swing日期选择控件(对原控件作了一些修改,增加了月份选择的控件)

    Swing日期选择控件,对原控件作了一些修改,增加了月份选择的控件。把图标换成了黑白的了,感觉彩色的太花。 xDatePicker是日期选择控件 xMonthPicker是月份选择控件

    java swing的日期控件

    JCalendar通常会附带一个日期选择器对话框,用户可以在不离开主窗口的情况下选择日期。要使用JCalendar,你需要先将其库引入到项目中,然后创建一个JCalendar实例并添加到你的容器(如JPanel)中。 ```java import ...

    swing时间选择控件

    2. **JSpinner日期选择器**: Swing内置的JSpinner可以用来创建一个日期选择器。JSpinner依赖于SpinnerDateModel,它允许用户通过增加或减少日期来选择时间。例如: ```java DateModel model = new ...

    日期选择器各种程序语言通用日期选择控件

    这个主题涵盖的“日期选择器”是一个跨程序语言的通用控件,意味着无论你是使用Java、JavaScript、Python、C#还是其他编程语言,都可以找到适合的实现方式来集成这种功能。下面将详细介绍日期选择器的原理、常见类型...

    netbeans日期选择器插件

    综上所述,NetBeans日期选择器插件是Java开发者的一个实用工具,它简化了日期输入组件的使用,提升了应用的用户体验,并提供了强大的定制能力和灵活性。通过深入理解和熟练运用,开发者可以更高效地构建具备日期选择...

Global site tag (gtag.js) - Google Analytics