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

Spinner Model Controls(二)

 
阅读更多

14.2 SpinnerModel接口

到目前为止,我们已经了解了如何与主JSpinner类交互。SpinnerModel接口是组件的数据模型。SpinnerModel的定义如下:

public interface SpinnerModel {
  // Properties
  public Object getValue();
  public void setValue(Object);
  public Object getNextValue();
  public Object getPreviousValue();
  // Listeners
  public void addChangeListener(ChangeListener);
  public void removeChangeListener(ChangeListener);
}

SpinnerMOdel的六个方法直接映射到JSpinner的相应方法。JSpinner方法只是将这些方法调用转向模型的方法,尽管在监听器方法的情况下,事件源是我们关联监听器的地方。

14.3 AbstractSpinnerModel类

SpinnerModel接口的基本实现是AbstractSpinnerModel类。他提供了监听器列表的管理与通知。子类必须实现其他的四个与值相关的接口方法。SpinnerModel接口的实现有:SpinnerDateModel,SpinnerListModel与SpinnerNumberModel。

14.3.1 SpinnerDateModel类

正如其名字所暗示的,SpinnerModel提供了日期的选择。这个类有两个构造函数:一个在默认情况下选择所有的日期,而另一个允许我们限制范围。

public SpinnerDateModel()
SpinnerModel model = new SpinnerDateModel();
JSpinner spinner = new JSpinner(model);
public SpinnerDateModel(Date value, Comparable start, Comparable end,
  int calendarField)
Calendar cal = Calendar.getInstance();
Date now = cal.getTime();
cal.add(Calendar.YEAR, -50);
Date startDate = cal.getTime();
cal.add(Calendar.YEAR, 100);
Date endDate = cal.getTime();
SpinnerModel model =
  new SpinnerDateModel(now, startDate, endDate, Calendar.YEAR);
JSpinner spinner = new JSpinner(model);

如果我们没有指定任何参数,则没有起始点与结束点。这里所显示的示例使用参数来提供100年的范围。最后一个域应是Calendar类的一个常量:

•Calendar.AM_PM

•Calendar.DAY_OF_MONTH

•Calendar.DAY_OF_WEEK

•Calendar.DAY_OF_WEEK_IN_MONTH

•Calendar.DAY_OF_YEAR

•Calendar.ERA

•Calendar.HOUR

•Calendar.HOUR_OF_DAY

•Calendar.MILLISECOND

•Calendar.MINUTE

•Calendar.MONTH

•Calendar.SECOND

•Calendar.WEEK_OF_MONTH

•Calendar.WEEK_OF_YEAR

• Calendar.YEAR

注意,SpinnerModel不包含任何与时区相关的Calendar常量。我们不可以通过SpinnerDateModel在JSpinner内进行滚动。

表14-3列出了SpinnerModel接口的三个属性以四个SpinnerDateModel的特定属性。


通常情况下,我们将会使用的唯一新属性是用于获取最终的日期,尽管他所做的是以合适的数据类型包装getValue()的方法的结果。如果我们为构造函数提供了一个日期范围,在当前值为边界条件时,前一个或是后一个值将为null。

14.3.2 SpinnerListModel类

SpinnerListModel提供了由条目列表中,或者是至少是他们的字符串表示中进行选择。这个类有三个构造函数:

public SpinnerListModel()
SpinnerModel model = new SpinnerListModel();
JSpinner spinner = new JSpinner(model);
public SpinnerListModel(List<?> values)
List<String> list = args;
SpinnerModel model = new SpinnerListModel(list);
JSpinner spinner = new JSpinner(model);
public SpinnerListModel(Object[] values)
SpinnerModel model = new SpinnerListModel(args);
JSpinner spinner = new JSpinner(model);

当没有提供参数时,模型只包含一个元素:字符串empty。List版本具有一个到列表的引用。他并没有拷贝这个列表。如果我们修改这个列表,我们就修改了模型中的元素。数组版本创建了一个不可以添加的私有的List实例的内联类。对于List与数组版本,初始时选中的是第一个元素。如果其中一个为空,则会抛出IllegalArgumentException。

如表14-4所示,在接口之外所添加的唯一属性就是获取或是设置列表。


14.3.3 SpinnerNumberModel类

SpinnerNumberModel提供了由一个无限制或是有限制的值范围内进行数字选择。所选择的数字可以是Number的任意子类,包括Integer与Double。这个类具有四个构造函数,而前三个都是最后一个的简化版。

public SpinnerNumberModel()
SpinnerModel model = new SpinnerNumberModel();
JSpinner spinner = new JSpinner(model);
public SpinnerNumberModel(double value, double minimum, double maximum,
  double stepSize)
SpinnerModel model = new SpinnerNumberModel(50, 0, 100, .25);
JSpinner spinner = new JSpinner(model);
public SpinnerNumberModel(int value, int minimum, int maximum, int stepSize)
SpinnerModel model = new SpinnerNumberModel(50, 0, 100, 1);
JSpinner spinner = new JSpinner(model);
public SpinnerNumberModel(Number value, Comparable minimum, Comparable maximum,
  Number stepSize)
Number value = new Integer(50);
Number min = new Integer(0);
Number max = new Integer(100);
Number step = new Integer(1);
SpinnerModel model = new SpinnerNumberModel(value, min, max, step);
JSpinner spinner = new JSpinner(model);

如果最小值或是最大值为null,则这个范围就是无限制的。对于无参数的版本,初始值为0而步进值为1。步进尺寸是字面值,所以如果我们将这个步进值设置为.333,则并不完美。

表14-5显示了SpinnerNumberModel的属性。所添加的属性与构造函数所提供的相同。


14.3.4 自定义模型

通常情况下,JSpinner的可用模型就足够了,所以我们并不需要派生。然而,所提供的模型并不能总是满足我们的需求。例如,我们也许希望使用一个包装了SpinnerListModel的自定义模型,而不希望停在第一个或是最后一个元素上,他向另一个方向环绕。列表14-2显示了一个这样的实现。

package swingstudy.ch13;
 
import java.util.List;
 
import javax.swing.SpinnerListModel;
 
public class RolloverSpinnerListModel extends SpinnerListModel {
 
	public RolloverSpinnerListModel(List<?> values) {
		super(values);
	}
 
	public RolloverSpinnerListModel(Object[] values) {
		super(values);
	}
 
	public Object getNextValue() {
		Object returnValue = super.getNextValue();
		if(returnValue == null) {
			returnValue = getList().get(0);
		}
		return returnValue;
	}
 
	public Object getPreviousValue() {
		Object returnValue = super.getPreviousValue();
		if(returnValue == null) {
			List list = getList();
			returnValue = list.get(list.size()-1);
		}
		return returnValue;
	}
}


分享到:
评论

相关推荐

    spinner实现省市二级联动

    本示例主要讲解如何利用Spinner实现省市二级联动的功能,这是一个在许多应用中都需要用到的功能,如地址填写、定位服务等。下面将详细介绍这个过程。 首先,我们需要明白什么是二级联动。二级联动是指在一个选择框...

    Spinner二级联动下拉菜单

    "Spinner二级联动下拉菜单"是一个更复杂的功能,它涉及到两个Spinner,一个选择省份,另一个根据省份的选择动态加载并显示对应的城市。这个功能的实现涉及到多个知识点,下面将逐一详细讲解。 1. **Spinner基本使用...

    android spinner 省份市二级联动

    在“android spinner 省份市二级联动”这个场景中,我们通常需要实现一个功能,即当用户在第一个Spinner(省份)中选择一个特定的省份时,第二个Spinner(城市)会自动更新为对应省份的城市列表。这种联动效果在很多...

    Spinner的二级联动

    本示例探讨的是如何实现Spinner的二级联动效果,即一个Spinner的选择会影响到另一个Spinner的显示内容。这样的功能常见于多级分类或者层级关系较深的数据选择场景。 首先,我们需要了解Spinner的基本使用。Spinner...

    spinner二级省市级联

    本示例“spinner二级省市级联”是针对如何使用Spinner实现省市区三级联动的一个经典应用场景。在这个项目中,我们将会看到如何通过编程方式处理这种复杂的交互。 首先,Spinner的使用通常涉及到数据的加载和适配器...

    MaterialSpinner 自定义Spinner

    在Android开发中,Spinner是一个常用的组件,用于展示一个下拉选择菜单,通常用在需要用户从预设选项中选择一项的场景。然而,系统默认的Spinner样式和交互可能无法满足所有设计需求,这时我们就需要对其进行自定义...

    Android 二级spinner联动工具类

    Android 二级spinner联动工具类 适用于任何二级spinner联动

    省市二级spinner

    "省市二级spinner"是一个特定的应用场景,它用于展示中国的省市区两级联动的选择效果,常见于地址输入或区域筛选等场景。这个项目非常适合初学者学习,因为它涉及到基础的Android组件使用、数据处理以及用户交互。 ...

    android控件之 spinner 实现省市二级联动 源码

    android的控件spinner,类似于一个下拉列表.如果您正在学习这个控件,需要实现基于这个控件的二级联动效果,不妨使用这个看看. 使用方法:用eclipse导入,假若报错,把平台改为android2.2,jdk1.6就可以了。

    Android带设置默认值的Spinner

    在Android开发中,Spinner是一个常用的组件,用于提供一个下拉选择菜单,用户可以在其中选择一个选项。本示例关注的是如何创建一个具有默认值并能自定义显示与下拉效果的Spinner。以下将详细介绍实现这一功能的关键...

    android spinner 自定义 字体大小

    在Android开发中,Spinner是一个常用的UI组件,它用于在下拉列表中展示多个选项供用户选择。当需要自定义Spinner的字体大小时,开发者需要对Spinner的样式进行一些定制。以下是一些关于如何自定义Android Spinner...

    安卓实现带搜索框的Spinner

    在Android开发中,Spinner是一个非常常用的控件,它通常用于展示一个下拉列表供用户选择。Spinner的功能类似于iOS中的PickerView或网页中的下拉菜单。然而,为了提供更好的用户体验,有时我们需要在Spinner中添加...

    Android 实例讲解 Spinner样式修改

    对于android项目开发来说,常常会用到Spinner实现下拉框的效果。而对于Spinner加载适配器的方法有多种: 1.直接加载android自带的ArrayAdapter,SimpleAdapter; 2.自定义继承BaseAdapter的适配器。 对于适配器加载...

    Spinner

    Spinner是Android开发中常见的一种控件,它在用户界面中常用于实现下拉选择功能,类似于iOS中的PickerView。在Android应用中,Spinner通常用于显示一组可选的条目,用户可以通过点击或触摸来展开选项列表,然后进行...

    Android Spinner设置默认标题

    在Android开发中,Spinner是一个非常常用的组件,它用于在下拉菜单中展示一系列选项供用户选择。Spinner在很多场合下可以替代多个按钮或开关,提供更简洁的操作界面。本篇文章将详细讲解如何在Android中设置Spinner...

    两个spinner联动

    比如,当用户在第一个Spinner(省份)中选择了某个省份,第二个Spinner(城市)则只显示该省份下的城市。 三、实现步骤 1. **创建数据源**:首先,你需要准备两个Spinner的数据源,如一个ArrayList或ArrayAdapter...

    Android自定义Spinner样式

    在Android开发中,Spinner是一个非常常用的控件,它允许用户从一组预定义的选项中进行选择。默认情况下,Spinner的样式可能无法满足所有设计需求,因此开发者常常需要对其进行自定义,以实现更个性化的视觉效果。...

    spinner的例子demo

    Spinner是Android系统中的一种下拉选择控件,它通常用于在有限的选项中进行选择,类似于iOS中的PickerView。在Android开发中,Spinner是一个非常实用的组件,可以在界面上提供简洁的交互方式,用户可以点击后展开...

    android_spinner_spinner_android_

    在Android开发中,Spinner是一个非常常用的控件,它允许用户从一组预定义的选项中进行选择,类似于下拉菜单。Spinner控件不仅简洁,而且能够有效地节省屏幕空间,尤其适用于移动设备。本示例源码将详细介绍如何创建...

Global site tag (gtag.js) - Google Analytics