swing 实现点击文本框弹出选择日期的界面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swing 实现点击文本框弹出选择日期的界面相关的知识,希望对你有一定的参考价值。

swing实现点击文本框时弹出日期选择框,跟js的效果一样,但是用swing实现

没有实现的类,可以自己写一个。
这有一个类。你可以试一下:
package com;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;
import javax.swing.event.DocumentListener;
import javax.swing.text.DateFormatter;

import com.shiji.pastoral.common.arithmetic.CalculateDate;
import com.shiji.pastoral.common.arithmetic.GlobalStatus;
import com.shiji.pastoral.server.common.method.DebugPrint;

/**
* 日期控件
*
* @author 2008-5-23 上午11:38:14
*/
public class DatePanel extends JPanel

private CalculateDate cal = new CalculateDate();

public JFormattedTextField hotelFormattedTextField;

public JButton dateButton;

private Window dialog;

private String labelName; // 每个Date的名称都不一样

private int x; // 跳出日期控件的x轴

private int y; // 跳出日期控件的y轴

public static String initDate = "1900-01-01";// CalculateDate.dateToString(CalculateDate.NULLDATE);

// // 系统默认Date

private boolean judge;

private String type = "-";

private static String time;

private JRadioButton enableRadioButton;

private boolean allowEmptyStr = true;// 是否允许文本框为空

public FocusAdapter f;

/**
* 系统初始化构造函数
*
* @author 2008-7-22 上午11:38:27
*
*/
public DatePanel()
this(false);


public DatePanel(JDialog dialog)
this(dialog, true);


public DatePanel(boolean showRadioBox)
super();
dialog = DFrame.frame;
initGUI();
enableRadioButton.setVisible(showRadioBox);


/**
* 旧的方法,不建议使用,最终还是要删除的。。。by Jimmy
*
* @deprecated
* @param dialog
* @param labelName
* @param judge
*/
public DatePanel(Window dialog, String labelName, boolean judge,
boolean showRadioBox)
super();
this.dialog = dialog;
this.labelName = labelName;
this.judge = judge;
initGUI();
enableRadioButton.setVisible(showRadioBox);


public DatePanel(Window dialog, String labelName, boolean judge)
this(dialog, labelName, judge, false);


public DatePanel(Window dialog, boolean judge)
super();
this.dialog = dialog;
this.labelName = "";
this.judge = judge;
initGUI();
enableRadioButton.setVisible(false);


private void initGUI()

this.setPreferredSize(new java.awt.Dimension(139, 21));
BorderLayout thisLayout = new BorderLayout();
this.setLayout(thisLayout);
this.add(getDateButton(), BorderLayout.EAST);
this.add(getHotelFormattedTextField(), BorderLayout.CENTER);
this.add(getEnableRadioButton(), BorderLayout.WEST);



private JFormattedTextField getHotelFormattedTextField()
// MaskFormatter mf = null;
// try
// mf = new MaskFormatter("####-##-##");
// // mf.setValueContainsLiteralCharacters(false);
// catch (Exception e)
// e.printStackTrace();
//

/*
* hotelFormattedTextField = new JFormattedTextField();
* hotelFormattedTextField.setDocument(new DateLimited(
* hotelFormattedTextField, new SimpleDateFormat("yyyy" + type + "MM" +
* type + "dd"))); hotelFormattedTextField.setText(initDate);
* hotelFormattedTextField.addFocusListener(new FocusAdapter() public
* void focusLost(FocusEvent evt) if
* (hotelFormattedTextField.getText().indexOf(" ") != -1 && judge)
* JOptionPane.showMessageDialog(dialog, "Date is null!");
* hotelFormattedTextField.setText(" " + type + " " + type + " ");
* hotelFormattedTextField.requestFocus(); );
*/
// if(dateFormatType.trim().isEmpty()||dateFormatType==null)
// dateFormatType = CalculateDate.dateFormatType;// "yyyy-MM-dd";
DateFormat dateFormat = new SimpleDateFormat(
CalculateDate.dateFormatType);
DateFormatter df = new DateFormatter(dateFormat);
hotelFormattedTextField = new JFormattedTextField(df);
hotelFormattedTextField
.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
hotelFormattedTextField.setBorder(new SoftBevelBorder(
BevelBorder.LOWERED, null, null, null, null));
hotelFormattedTextField.setFont(new java.awt.Font(null, 1, 12));
hotelFormattedTextField.setValue(CalculateDate.HotelDate);
if (allowEmptyStr)
hotelFormattedTextField.setText("");// 设置为空时间
else
hotelFormattedTextField.setValue(CalculateDate.HotelDate);
hotelFormattedTextField.addFocusListener(new FocusAdapter()
public void focusLost(FocusEvent evt)
if (hotelFormattedTextField.getText().trim().isEmpty()
&& allowEmptyStr)
// DebugPrint.onePrint("现在输入的是空串");
hotelFormattedTextField
.setFocusLostBehavior(JFormattedTextField.PERSIST);// 不执行任何操作,不获取新的
// AbstractFormatter
// 也不更新该值。
else
hotelFormattedTextField
.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);// 恢复显示以匹配
// getValue,这可能丢失当前的编辑内容
if (hotelFormattedTextField.isEditValid())
// DebugPrint.onePrint("现在输入的是有效值");
hotelFormattedTextField.setFocusLostBehavior(JFormattedTextField.PERSIST);
if (CalculateDate.isNullDate(getDate()))
// DebugPrint.onePrint("现在输入的时间是空时间");
hotelFormattedTextField.setText("");
else if(getDate().compareTo(CalculateDate.NULLDATE)<0)
DefinedOptionPane.showMessageDialog(null,GlobalStatus.lang("Invalid Date can't less than 1900-01-01"), 1);
setDate(CalculateDate.getHotelDate(GlobalStatus.userStructure.getHotelID()));
else if(getDate().compareTo(CalculateDate.MAXDATE)>0)
DefinedOptionPane.showMessageDialog(null,GlobalStatus.lang("Invalid Date can't more than 3000-12-31"), 1);
setDate(CalculateDate.getHotelDate(GlobalStatus.userStructure.getHotelID()));

else
if (!hotelFormattedTextField.getText().trim().isEmpty())
// DebugPrint.onePrint("现在输入的是无法效值");
DefinedOptionPane
.showMessageDialog(null,
GlobalStatus.lang("Invalid Date: ")
+ hotelFormattedTextField
.getText(), 1);
// hotelFormattedTextField.setText(initDate);





);

return hotelFormattedTextField;


private int getX(MouseEvent evt)
int x1 = evt.getXOnScreen() - evt.getX()
- hotelFormattedTextField.getWidth();
int x2 = DFrame.width - CalendarDialog.width;
DebugPrint.jimmyPrintMsg(x1, x2);
return x1 > 0 ? Math.min(x1, x2) : 0;


private int getY(MouseEvent evt)
int y1 = evt.getYOnScreen() + dateButton.getHeight() - evt.getY();
int y2 = DFrame.height - CalendarDialog.height;
if (y1 > y2)
y1 = evt.getYOnScreen() - evt.getY() - CalendarDialog.height;
return y1;


private JButton getDateButton()
if (dateButton == null)
dateButton = new JButton();
dateButton.setIcon(new ImageIcon(getClass().getClassLoader()
.getResource("img/down.png")));
dateButton.setPreferredSize(new java.awt.Dimension(20, 21));
dateButton.addMouseListener(new MouseAdapter()
public void mousePressed(MouseEvent evt)
x = getX(evt);
y = getY(evt);

);
dateButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent evt)
try
time = CalculateDate.dateToString(new CalendarDialog(
dialog, x, y, getDate()).getDate());
catch (RuntimeException e)
time = CalculateDate.dateToString(new CalendarDialog(
dialog, x, y, new Date()).getDate());

hotelFormattedTextField.setText(time.length() == 10
? time
: initDate);
hotelFormattedTextField.requestFocus();
time = initDate;

);

return dateButton;


/**
* 设置日期..不推荐用这个。。没测试过one
*
* @author 2008-8-5 上午10:37:33
*
* @param date
*/
public void setDate(String date)
// setDate(new CalculateDate().stringToDate(date));
// hotelFormattedTextField.setValue(CalculateDate.dateFormat(new
// CalculateDate().stringToDate(date), dateFormatType));
if (date.trim().isEmpty())
hotelFormattedTextField.setText("");
else
setDate(CalculateDate.stringToDateExp(date));


public String getText()
return CalculateDate.dateToString(getDate());


/**
* 获取日期
*
* @author 2008-8-5 上午10:37:46
*
* @return
*/
public Date getDate()
// Date returndate;
// returndate = new CalculateDate().stringToDate(hotelFormattedTextField
// .getText());
if (hotelFormattedTextField.getText().trim().isEmpty())
// DebugPrint.onePrint("现在的日期是" + cal.stringToDate("1900-01-01"));
return cal.stringToDate("1900-01-01");
else
// DebugPrint.onePrint("现在的日期是"+
// cal.stringToDate(hotelFormattedTextField.getText()));
return cal.stringToDate(hotelFormattedTextField.getText());



/**
*
*
* @author Administrator 2008-9-16 下午02:33:24
*
* @param date
*/
public void setDate(Date date)
// hotelFormattedTextField.setText(date != null ? new CalculateDate()
// .dateToString(date) : initDate);
if (CalculateDate.isNullDate(date))
hotelFormattedTextField.setText("");
else
hotelFormattedTextField.setText(CalculateDate.dateToString(date));


/**
* 设置文本框是否能为空
*
* @author One 2009-6-4上午10:09:14
*
* @param allow
*/
public void setAllowEmptyStr(boolean allow)
allowEmptyStr = allow;


/**
* 设置错误日期的颜色
*
* @author One 2009-6-10下午04:27:58
*
* @param error
*/
public void setColour(boolean error)
if (error)
hotelFormattedTextField.setForeground(Color.RED);
else
hotelFormattedTextField.setForeground(Color.BLACK);



@Override
public void setEnabled(boolean enabled)
super.setEnabled(enabled);
hotelFormattedTextField.setEnabled(enabled);
dateButton.setEnabled(enabled);
enableRadioButton.setSelected(enabled);


private JRadioButton getEnableRadioButton()
if (enableRadioButton == null)
enableRadioButton = new JRadioButton();
enableRadioButton.setSelected(true);
enableRadioButton.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent evt)
setEnabled(enableRadioButton.isSelected());

);

return enableRadioButton;


public static void main(String[] args)
JDialog frame = new JDialog();
frame.getContentPane().add(new DatePanel());
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);


/**
* @author rainbow 2009-7-14 下午12:01:55
* @param listener
*
*/
public void addDocumentListener(DocumentListener listener)
hotelFormattedTextField.getDocument().addDocumentListener(listener);


/**
* @author rainbow 2009-7-14 下午12:01:58
* @param listener
*
*/
public void removeDocumentListener(DocumentListener listener)
hotelFormattedTextField.getDocument().removeDocumentListener(listener);

参考技术A JOptionPane 用这个类试试. 参考技术B org.jdesktop.swingx.JXDatePicker
搜一下swingx就可以找到这个包了

怎么实现鼠标点击input输入框弹出一个日期选择框

最简单的方式就是使用H5里提供的新属性,用法如下:

<input type="date" >

如果你的项目里不支持H5或者H5不适用,就只能自己用JS来实现了

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="../js/showdate.js"></script>
<title>js点击input弹出时间选择器代码 - xw素材网</title>
<style>
.text_time 
width: 207px;
height: 35px;
background: #ffffff;
border: 1px solid #56da9e;

</style>
</head>

<body>
<br>
<div style="width:520px;margin:0 auto;">
<input type="text" id="time" value="选择时间" onClick="return Calendar(\'time\');" class="text_time" />
</div>

</div>
</body>

</html>

关键是要引入showdate.js,你必须先下载showdate.js,再在项目中引入这个JS外部文件才会生效。
参考技术A

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  

    <html xmlns="http://www.w3.org/1999/xhtml">  

    <head>  

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  

    <title>点击text文本框弹出日期选择器</title>  

    <!--可无视-->  

    <style type="text/css">  

    bodymargin:0;padding:0;font:14px Verdana, Arial, sans-serif;line-height:200%;  

    #contentpadding-left:50px;padding-right:50px;  

    #content h2font-size:18px;color:#1E9300;padding-top:8px;margin-bottom:8px;  

    #content h3margin-top:8px;margin-bottom:8px;FONT:bold 14px 宋体,tahoma,arial,sans-serif;COLOR:#0033CC;  

    #content divmargin-top:10px;margin-bottom:10px;border:#666 solid 1px;padding:10px;  

    #content spancolor:#f00;font-weight:bold;  

    ul, olcolor:#000000;  

    </style>  

    <!--必要js文件/样式表已经引入在js里面了-->  

    <script type="text/javascript" src="lhgcore.js"></script>  

    <script type="text/javascript" src="lhgcalendar.js"></script>  

    </head>  

    <body>  

    <div id="content">  

    <h2>常规弹出日历示例页</h2>  

    <hr size="1" style="width:400px;" align="left">  

    <h3>1. 在控件下面或右面弹出日历组件(默认是在下面弹出) </h3>  

    <div>  

    <input type="text" id="c1" onclick="J.calendar.get();"/> 显示在下面      

    <input type="text" id="c2" onclick="J.calendar.get(dir:'right');"/> 显示在右面  

    </div>  

    <h3>2. 通过按钮或图片等其它控件弹出日历组件</h3>  

    <div>  

    <input type="text" id="c3"/>  

    <input type="button" id="btn" onclick="J.calendar.get(id:'c3');" value="弹出"/>      

    <input type="text" id="c4"/>  

    <img align="absmiddle" src="images/date.gif" onclick="J.calendar.get(id:'c4');"/>  

    </div>  

    <h3>3. 显示日期的2种格式(默认为 年-月-日 格式)</h3>  

    <div>  

    <input type="text" id="c5" onclick="J.calendar.get();"/> 年-月-日 格式      

    <input type="text" id="c6" onclick="J.calendar.get(type:'/');"/> 月/日/年 格式  

    </div>  

    <h3>4. 在文本框显示带时间的日期</h3>  

    <div>  

    <input type="text" id="c7" onclick="J.calendar.get(time:true);"/>  

    </div>  

    <h3>5. 日期范围限制</h3>  

    <div>  

    <input type="text" id="c8" onclick="J.calendar.get(to:'2009-8-8,min');"/> 只能选择2009-8-8以前的日期      

    <input type="text" id="c9" onclick="J.calendar.get(to:'2009-8-18,max');"/> 只能选择2009-8-18以后的日期<br/>  

    <input type="text" id="c10" onclick="J.calendar.get(to:'c11,min');"/>  

    <input type="text" id="c11" onclick="J.calendar.get(to:'c10,max');"/> 这2个文本框,前面的日期不能大于后面的日期,后面的不能小于前面的日期。  

    </div>  

    </div>  

    <div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';">  

    </div>  

    </body>  

    </html>  

参考技术B input有个<input type="date" />直接显示 望采纳.. 参考技术C 网上有很多这样的例子,写好的日历控件,拿来用就是了。这里输入有限制,装不下全部代码。本回答被提问者采纳 参考技术D   你好,可以使用My97日期控件,简单示例

1
2
3
4
5
6
7
8
9
10
11

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="http://www.my97.net/dp/My97DatePicker/WdatePicker.js"></script>
</head>
<body>
<input type="text" id="d11" onclick="WdatePicker()">
</body>
</html>

  导入js直接使用,具体详细使用可参考文档

以上是关于swing 实现点击文本框弹出选择日期的界面的主要内容,如果未能解决你的问题,请参考以下文章

点击文本框弹出可供选择的checkbox复选框代码实例

简单的jQuery日期选择

jquery日历插件问题

java如何实现鼠标移到文本框上弹出一个消息框

在点击文本字段时显示日期选择器

Excel表格中怎么把日期格式转换成文本格式?