JComboBox实现时间控件
1.认识JComboBox控件
最近学习使用了JComboBox组件;
在学习使用了JList以及Jtree组件之后,对于使用JComboBox还是很轻松的。
JcomboBox的其实也是由一个Model模型,一个Render渲染器组成,在JComboBox里面,默认的是实现文字或者图片的列表,所以想要实现图片加文字的效果就要自己去重写他的渲染器。
首先,一个JComboBox的构造方法,可以看一下他的源代码,最近发现看他的源代码比起看API文档是要清楚很多。
public JComboBox(ComboBoxModel<E> aModel) {
super();
setModel(aModel);
init();
}
public JComboBox(E[] items) {
super();
setModel(new DefaultComboBoxModel<E>(items));
init();
}
public JComboBox(Vector<E> items) {
super();
setModel(new DefaultComboBoxModel<E>(items));
init();
}
public JComboBox() {
super();
setModel(new DefaultComboBoxModel<E>());
init();
}
所以这里也可以看出我们的JComboBox在构造的时候就必须实例化一个Model,当我们直接给的是一组数据的时候,那么JcomboBox则会根据这组数据去创建一个DefaultComboBoxModel,把它设为JcomboBox的model。而也可以直接传入一个实例化的model。然后看一下DefaultComboBoxModel的构造函数,源码如下:
/**
* Constructs a DefaultComboBoxModel object initialized with
* an array of objects.
*
* @param items an array of Object objects
*/
public DefaultComboBoxModel(final E items[]) {
objects = new Vector<E>();
objects.ensureCapacity( items.length ); int i,c;
for ( i=0,c=items.length;i<c;i++ )
objects.addElement(items[i]); if ( getSize() > 0 ) {
selectedObject = getElementAt( 0 );
}
} /**
* Constructs a DefaultComboBoxModel object initialized with
* a vector.
*
* @param v a Vector object ...
*/
public DefaultComboBoxModel(Vector<E> v) {
objects = v; if ( getSize() > 0 ) {
selectedObject = getElementAt( 0 );
}
}
在DefaultComboBoxModel里面,他只有一下的两个属性:
Vector<E> objects;
Object selectedObject;
一个是Vector对象,一个是一个Object对象,一个是存储当前的JcomboBox里面显示的数据,当传入的是一个数组的时候,也会存放在objects这个对象中,一个是存放选择的数据。在默认情况下,如果自己没有设置的话,刚开始是默认设置选择第一数据。
对于渲染器,JcomboBox的的渲染器和Jlist的渲染器是一样的,是ListCellRenderer。
public class UserJComboBoxRenderer extends JLabel implements ListCellRenderer { @Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) { User user=(User)value;
this.setIcon(null);
if(index!=-1){
ImageIcon img=user.getImg();
img.setImage(img.getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT));
this.setText(user.getID());
this.setIcon(img);
}else
this.setText(user.getID());
return this;
}
}
这是我为我的QQ聊天登入界面,写的一个用户输入账号写的一个JComboBox组件。
这里可以注意一点的是, index的值,JComboBox是由可编辑字段与下拉列表组合的组件,也就是一个输入框以及一个下拉列表组合。在JcomboBox中选中的元素由下标-1标识,所以我们可以通过下标来设置达到不一样的效果,这里设置的是当选中了,在输入框中只显示文字。
在下拉列表中则是显示文字和图片。
JComboBox加监听:
JComboBox设置为当他可以编辑的时候,直接给他加上焦点监听,是不起作用的。
comboBox.addFocusListener(l);//当JComboBox为可以编辑时,是监听不起作用。
而是需要通过给JcomboBox的编辑的那个面板加上监听,如下:
comboBox.getEditor().getEditorComponent().addFocusListener(l);
这样监听才起作用。
2.自定义年月日控件
用JComboBox实现选择年月日(出生日期):
思路是:
1定义一个CalendarChooser 类继承自JPanel。其中有三个JcomboBox属性,分别表示年,月,日;
private JComboBox<String> year;
private JComboBox<String> date;
private JComboBox<String> month;
2.在构造方法中实例化上述三个属性,分别给各自的Item赋值;
3.把他们添加到面板JPanel上(也就是该类本身);同时设置好布局(采用的是BorderLayout布局方式);
4.加上监听,month的Item的依据是选择的年份,然后date的Item则是同时依据year和month;也就是没有选择年份的时候就不能显示月份,没有年份和月份的时候,date就不能显示数据。
具体实现:
重点是设置year,date,month这三个JcomboBox的属性Item:
1.设置year的属性,
通过Calendar.getInstance();创建一个Calendar对象。然后根据这个对象获取到当前时间的年份,然后利用一个for循环,把当前年,以及过去的80年添加到里面去。在year这个控件里面Item放入80个年份,提供选择;
Calendar cal = Calendar.getInstance();/**
* @param year
* the year to set
*/
public void setYearItem(JComboBox<String> year, Calendar cal) {
int nowyear = cal.getWeekYear();
for (int i = 0; i < 80; i++) {
year.addItem(nowyear-- + "年");
}
}
2.设置month的Item属性
年份是不变的,但是月份是要随着年份的改变而变化,所以我们需要对其进行判断,如果选择的是当前的年份的话,则month里面的Item值只到当前月份。主要考虑的是今年的月份只到当前的月份。
/**
* @param month
* the month to set
*/
public void setMonthItem(JComboBox<String> month, Calendar cal) {
month.removeAllItems();
int nowmonth;//记录选择的年份的月数
if (year.getSelectedItem().equals(cal.getWeekYear() + "年")) {
nowmonth = cal.get(Calendar.MONTH) + 1;
} else {
nowmonth = 12;
}
for (int i = 1; i <= nowmonth; i++) {
month.addItem(i + "月");
}
month.setSelectedIndex(0);
}
3.设置date的Item属性
天数根据选择的月份和年份进行添加;
public void setDateItem(JComboBox<String> date, Calendar cal) {
date.removeAllItems();
int nowdate = 0;// 当前月的总天数;
if (month.getItemCount() != 0) {
if (year.getSelectedItem().equals(cal.getWeekYear() + "年")&& month.getSelectedIndex() == month.getItemCount() - 1) {
nowdate = cal.get(Calendar.DATE);
} else {
/** 把字符串进行拆分,去掉年和月 */
String s = (String) year.getSelectedItem();
String year = s.substring(0, s.length() - 1);
s = (String) month.getSelectedItem();
String month = s.substring(0, s.length() - 1);
nowdate = getDaysByYearMonth(cal, Integer.parseInt(year), Integer.parseInt(month));
}
for (int i = 1; i <= nowdate; i++) {
date.addItem(i + "日");
}
}
}
其中根据年月获取天数的方法:
public int getDaysByYearMonth(Calendar cal, int year, int month) {
/*
* cal.set(Calendar.YEAR,year);
* cal.set(Calendar.MONTH, month - 1);
* cal.set(Calendar.DATE, 1);
* 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
*/
cal.set(year, month - 1, 1);
// 向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。负的时间量意味着向下滚动。
cal.roll(Calendar.DATE, -1);
int maxDate = cal.get(Calendar.DATE);
return maxDate;
}
然后在给他们加上监听:
只需要个年份和月份加上监听就可以了。年份的改变会影响月和日,月的改变会影响日的改变。
public void addListener() {
CalendarListener l = new CalendarListener(this);
year.addItemListener(l);
month.addItemListener(l);
}
然后具体的监听事件:
public class CalendarListener implements ItemListener {
CalendarChooser ca;
public CalendarListener(CalendarChooser ca) {
this.ca = ca;
}
@SuppressWarnings("unchecked")
@Override
public void itemStateChanged(ItemEvent e) {
JComboBox<String> jcombox = (JComboBox<String>) e.getSource();
if (jcombox.getName().equals("年")) {
//年份改变然后月份进行改变;
ca.setMonthItem(ca.getMonth(),Calendar.getInstance());
//年份改变,天数进行改变;
// ca.setDateItem(ca.getDate(),Calendar.getInstance());
} else if (jcombox.getName().equals("月")) {
ca.setDateItem(ca.getDate(),Calendar.getInstance());
} }
}
注意的是,itemStateChanged监听方法会随着item的值的改变而改变,即使我们不去选择。只要item的值发生了变化,该方法就会被调用。
ca.setMonthItem(ca.getMonth(),Calendar.getInstance());
所以我们在执行上面这行代码的时候,下面也会被执行:
else if (jcombox.getName().equals("月")) {
ca.setDateItem(ca.getDate(),Calendar.getInstance());
}
以上就是全部核心代码了。
效果图:
另外图中的性别是:JRadioButton,同时用ButtonGroup进行包装(ButtonGroup用于为一组按钮创建一个多斥作用域。 使用相同的 ButtonGroup对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮)。
JComboBox实现时间控件的更多相关文章
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...
- [转]一种简单的js时间控件
使用方法: 粘贴代码到文本文档中,文档名称为datetime.js,然后在html文件中引用如下代码即可 <input name="shijian1" id="sh ...
- 疑似easyui本身bug:easyui时间控件问题,试了几个版本都不行
最近发现easyui时间控件的值格式不支持带斜杠的日期(2016/10/31),必须是2016-10-31这类的才能正常使用,否则默认初始化为当前时间 <input id="Retur ...
- JSP页面中的精确到秒的时间控件
技术:Struts1+jsp+MSql 需求:ncmgt网络监控系统中显示用户的操作日志,并且根据操作时间查询用户的详细操作记录.时间精确到秒 大致效果如下.上图! 大家可以清晰的看到.红色画线部分就 ...
- jquery 时间控件怎么能禁止输入只能选择日期?
jsp一个input输入框用的是easyui时间控件,现在问题是如何是这个input只能点击选择日期,而禁止手动输入 解决方法::: 在日期的input标签里面添加::::editable=" ...
- 模仿win10样式,基于jquery的时间控件
工作需要,写了一个基于jquery的时间控件,仿win10系统时间控件格式. 目前基本功能都有了,但时间格式只实现少数,但由于结构设计已经充分优化,填充起来非常容易. 这个控件相对网上其他的时间控件, ...
- js实现时间控件
<html><head> <title>时间控件</title></head><body > <input name=&q ...
- 第二章 时间控件(DateTime Picker)
这家伙太懒了,碰到问题才写博文,嘿嘿. 好了进入正题,二话不说,先放地址: 中文:http://www.bootcss.com/p/bootstrap-datetimepicker/index.htm ...
- jquery easyui datebox 时间控件默认显示当前日期的实现方法
jquery easyui datebox 时间控件默认显示当前日期的实现方法 直接class easyui-datebox后添加一个value="true"就可以
随机推荐
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_06-新增页面-前端-新增页面
新建一个添加的页面 复制page_list页面改改名字 page_add 一个标准的页面 <template> <div> 新增页面 </div> </tem ...
- Qt编写自定义控件30-颜色多态按钮
一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...
- 一百三十:CMS系统之七牛js和python的SDK使用示例
1.安装: pip install qiniu 2.编写获取uptoken的接口 @app.route('/uptoken/')def uptoken(): access_key = '' secre ...
- 一个BADI创建了两个实施会有什么问题呢?
BADI :LE_SHP_DELIVERY_PROC 创建了两个实施,会导致什么问题呢? 前台测试 调试 VL01N 进了这个断点:ZCL_IM_IM_LE_SHP_DELIV_001 F8之后 ...
- antd二级联动异步加载
/** * Created by Admin on 2016/9/19. * 批量导入 */ import React, {Component, PropTypes} from "react ...
- Ubuntu 16.04 RabbitMq 安装与运行
前言目前公司用阿里云 + redis 的方式实现的消息队列.了解了目前几种主流的消息组件(主要包括rabbitmq.kafka.)的优缺点后,这里为了深入学习rabbitmq,我在自己的腾讯云服务器上 ...
- python-数据库-优化
数据库的优化? 1. 优化硬件:采用SSD(固态驱动器,俗称固态硬盘),使用磁盘队列技术(RAID0,RAID1,RDID5)等: 2. 进行架构级别的缓存,静态化和分布式:(数据库-->渲染页 ...
- smoothstep(),平滑阶梯函数,平滑过渡函数【转】
函数定义: 参考:https://en.wikipedia.org/wiki/Smoothstep 相关函数图形如下: 计算机图形中经常用到正如上图所示的:两个smooth()函数相减. 相关C+ ...
- ajax提交文件,django测试脚本环境书写,froms组件,钩子函数
1.在新版本中,添加app是直接在settings设置中,将INSTALLED_APPS里添加app名字, 但是他的完整写法是 'app01.apps.App01Config' 因为新版本做了优 ...
- Vue触发隐藏input file的方法
1.使用input透明覆盖法 将input的z-index设置为1以上的数字并覆盖到需点击的内容上,将input的样式opacity设置为0(即为透明度为0),这样通过绑定在input上的change ...