Understanding Swing’s Model

Understanding Swing’s Model

 

经常用 Swing 开发 Java GUI 程序的人一定听过这样的说法 ,Swing 控件是按 MVC结构设计的。更准确地说, Swing是 Model-driven的结构。但不同 Swing控件的 Model,其作用是否相同呢?比如当你在使用 JButton时,你很少需要关心 ButtonModel的存在,但在 JTable使用时,你却总是需要用到 TableModel。更进一步,当你频繁的使用 JTable时 ,你会发现你可能不仅用到了 TableModel,还用到 TableColumnModel, ListSelectionModel。这使我们意识到 ,Model存在不同的种类,不同类型的 Model实现不同的功能。

 

GUI-State Model

 

首先,我们讨论第一种 Model, GUI–State Model 。 GUI-State Model的作用在于标识控件的视觉状态 (visual status)。例如按钮是否被点击,列表中的 Item是否被选中。 Swing的控件会代理对 GUI-State Model的操作,通常我们不要直接操作 GUI–State Model。

 

ButtonModel

 

最常见的 GUI-State Model是 ButtonModel,属于这个范畴的控件有 JButton , JToggleButton , JCheckBox, JRadioButton, JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem。 (所有 AbstractButton的子类 )

ButtonModel需要标识的状态有:

  1. PRESSED: Button是否被点击了
  2. ENABLED: Button能否被点击(是否显示呈灰色)
  3. ROLLOVER: 鼠标是否从 Button上划过。 Button通过判断这个属性判断是否要显示 RolloverIcon,当然前提是 Button通过 setRolloverIcon,设置了 RolloverIcon
  4. SELECTED: 只对 RadioButton or Checkbox 有用
  5. ARMED: 鼠标点击 Button后,是否在 Button该释放

显而易见,这些属性都只和显示有关。对于 GUI-State Model,只有以下两种情况我们需要关心它的处在 :( 1)我们想改变控件缺省的视觉行为(假定这种情况很少发生) (2)出于某种显示目的共用 Model,操作一个控件会改变另外一个控件的状态(下面会讨论到这种情况),其他情况下我们可以忽视它。当然还有一种情况我们需要注意,这就是在使用 JRadioButton时。因为使用 JRadioButton时,一组 JRadioButton同时只能有一个被选中 (SELECTED),这当然只有通过操作 ButtonModel的 SELECTED属性来实现。不过, Swing针对这个问题引入了 ButtonGroup类,通过 ButtonGroup.add()方法设置同一个 button group,因此我们同样不需要直接操作 ButtonModel。

 

BoundedRangeModel

 

另一个常见的 GUI-State Model是 BoundedRangeModel,属于这个范畴的控件有 JProgressBar  JScrollBar JSlider。

BoundedRangeModel标识的主要状态有: min,max,value(int),同样的,我们很少直接操作 BoundedRangeModel。使用 JProgressBar 最常见的方式是在构造函数里指定 min,max或是通过 get/set读写 min,max,value。而控件再把这些请求转发给 BoundedRangeModel。

前面提到出于某种显示目的,我们有可能需要直接操作 GUI-State Model。以下是一种可能的情况 (scenario):当我们把一幅面积较大的图像放在 JScrollPane,同时希望通过移动滑杆 (JSlider)来控制显示图像显示在 JScrollPane的部分。常见的做法是监听 BoundedRangeModel的 ChangeEvent事件 (addChangeListener(ChangeListener l)),当 JSlider改变了 Model的值时在 ChangeListener对显示作相应的调整。

 

TableColumnModel

 

TableColumnModel是 JTable特有的 GUI-State Model。 TableColumnModel用于管理 TableColumn。而 TableColumn代表了 JTable中的每一列数据的视觉属性,比如该列对应的 data-model index(这决定了要显示的内容,参见后面叙述) ,该列的宽度是否可变,列的最大、最小、首选宽度;该列的绘制器 TableCellRenderer和编辑器 TableCellEditor(JTable是面向列的,它基于每一列进行绘制和编辑 )

 

Selection Model

 

考虑这样一个问题,当使用 JTable时,如何设定从 X行到 Y行处于选择状态呢?

我们可以通过调要 JTable.setRowSelectionInterval(int index0, int index1)来实现。再进一步,如果想实现反转选择 (Toggle Selection),即单击齐数次处于选择状态,偶数次则处于非选择状态, JTable没有提供直接的方法来实现。因为 JTable将选择的工作交由 Selection Model来实现。察看 setRowSelectionInterval的实现

public void setRowSelectionInterval(int index0, int index1) {

selectionModel.setSelectionInterval(boundRow(index0), boundRow(index1));

    }

要实现 Toggle Selection就只有直接对 Selection Model进行编程。

Selection Model也属于 GUI- State Model的范畴,因为它标识也是一种视觉的状态,选中的 Item会加亮( high light)。和其他 GUI- State Model一样 ,通常我们不需要直接操作 Selection Model。

Selection Model标识的状态有:

  1. SINGLE_SELECTION
  2. SINGLE_INTERVAL_SELECTION
  3. MULTIPLE_INTERVAL_SELECTION

 

我们分析一下其他需要判断用户选择几种控件

  1. JList, 和 JTable一样用的是 ListSelectionModel
  2. JTree, JTree需要的 Selection Model最复杂,因此它有专门 Selection Model: TreeSelectionModel。
  3. JComboBox只能是单选,因此不需要有专门 Selection Model
  4. JFileChooser,通过设置 FILES_ONLY , DIRECTORIES_ONLY FILES_AND_DIRECTORIES (int) 来设定用户是否可选择文件,目录,或两者都可以。通过设定 multiSelectionEnabled属性来决定是否单选或多选,通过 File数组 selectedFiles记录当前的选择
  5. JTabbedPane, JTabbedPane的情况有些特殊,虽然 JTabbedPane也只能单选,但它能有专门的 Selection Model: SingleSelectionModel

对待 Selection Model的方式和其他 GUI-State Model一样,相应 Jcomponent都提供专门的函数屏蔽我们对它的直接操作。

 

Application-data model

 

这类的 Model决定了显示在控件中的内容,因此往往需要我们直接的操作。他们分别是:

  1. JList: ListModel
  2. JTable: TableModel
  3. JComboBox: ComboBoxModel
  4. JTree: TreeModel
  5. 各类 Text控件 :Document

 

ListModel

 

Swing首先定义了接口 ListModel

然后定义了抽象类 AbstractListModel实现这个接口。在抽象类里没有定义实际数据的存储方式。因此要实现 AbstractListModel,用户还需要定义这两个函数

  1. public int getSize();
  2. public Object getElementAt(int index);

因为没有定义实际数据的存储方式,当然没有办法提供这两个函数的实现。

最后 Swing提供缺省类 DefaultListModel实现抽象类,缺省类以 Vector作为存储数据的方式。

构造一个 JList的实例有四种方式:

JList()          

JList(final Object[] listData)

JList(final Vector listData)

JList(ListModel dataModel)

前三种构造函数里会分别生成相应的 ListModel。还可以在构造完后 JList还可以用以下的函数来制定 ListModel

void setListData(final Object[] listData)          

void setListData(final Vector listData)          

void setModel(ListModel model)

 

JList没有提供编辑其 Item的方法,用户是无法直接编辑其 Item的(这点和 JComboBox不同, JComboBox提供了直接编辑其 Item的方法),要改变 Item的内容需要直接操作 ListModel(用数组和 Vector生成 JList不适合用来显示可变内容的数据)。

要显示可变内容的 JList,最方便的方法是用 DefaultListModel,但由于它用 Vcetor作为其内部的存储数据的方式,决定他们在处理大数据量的显示时是不适宜的。首先 Vector有内部容量的概念,当容量不足以容纳更多的数据时 ,它需要重新分配一块内存,复制原内存的东西,并把原来的内存丢弃,这是非常耗时的动作;其次, Vector是线程安全的容器 (thread-safe collection),所有对容器的操作都需要同步 (synchronized),对于包含大数据量的 collection这也是非常耗时的。

因此对于大数据量的 Application-data,用户如果想用 collection,应该在 ArrayList和 LinkedList(thread-unsafe collection)之间选择:

  1. ArrayList也有内部容量的概念,但它提供了随机存取的功能 (random access), 使用它时可以预先申请一块较大的内存,以免以后重新分配内存。
  2. LinkedList没有内部容量的概念,因此不会重新分配内存,但它不提供随机存取的功能。

 

TableModel

 

Swing对 TableModel的处理和 ListModel类似:

首先定义了接口 TableModel,

然后定义了抽象类实现这个接口 AbstractTableModel。在抽象类里没有定义实际数据的存储方式。

要实现 AbstractTableModel,用户还需要定义这三个函数

  1. public getColumnCount()
  2. public Object getValueAt(int rowIndex, int columnIndex)
  3. public int getRowCount()

public String getColumnName(int column) 往往也需要定义,不然在表头将显示为 A,B,C,D …

最后 Swing提供缺省类 DefaultTableModel实现抽象类,缺省类以 Vector作为存储数据的方式。因此对大数据量的操作(比如用 JTable显示数据库查询的结果)同样不适合用 DefaultTableModel。当用 JTable显示数据库查询的结果,最好是扩展

AbstractTableModel,并让数据库每次只返回批量的数据。

 

JTable的构造函数比起 JList要复杂一些 , 因为它还需要指定 TableColumnModel。但对于 Application-data model 的处理和 JList是一样的。

 

ComboBoxModel

 

JComboBox和 JList很相似,都是用来显示一个列表项,并可以接受用户的选择 (JRadioButton也实现这个功能 )。但他们也有本质的不同, JComboBox可以接受用户的输入,并可以编辑已有的选项。通常在使用 JComboBox是把它分成两类:可编辑的和不可编辑的。缺省状态是不可编辑的,通过调用 JComboBox.setEditable(true)可将 JComboBox设置成可编辑。对应这两种状态 JComboBox定义了两类 data-model接口, ComboBoxModel和 MutableComboBoxModel。

 

ComboBoxModel的定义如下:

public interface ComboBoxModel extends ListModel {

  void setSelectedItem(Object anItem);

  Object getSelectedItem();

}

它扩展 ListModel并只是定义了用于获取和设置当前选项的办法,这是因为 JComboBox没有 Selection Model。

MutableComboBoxModel,顾名思义,当然是定义修改 data-model的方法,它的定义如下:

public interface MutableComboBoxModel extends ComboBoxModel {

    public void addElement( Object obj );

    public void removeElement( Object obj );

    public void insertElementAt( Object obj, int index );

    public void removeElementAt( int index );

}

Swing提供对 MutableComboBoxModel的实现 DefaultComboBoxModel,其内部 Vector来存储数据,当我们想提供自己的现实时,最方便的方法是可以扩展 AbstractListModel, 并选择是实现 ComboBoxModel还是 MutableComboBoxModel。

 

构造一个 JComboBox实例有四种方法:

public JComboBox()

public JComboBox(final Object items[])

public JComboBox(Vector items)

public JComboBox(ComboBoxModel aModel)

前三种构造函数里会分别生成相应的 DefaultComboBoxModel。 (个人觉得这样构造 JComboBox并不好,由于没有通过构造函数建立不变性 (invariants) ,即该 JComboBox是否可编辑的,当需要修改 data-model时, JComboBox都需要首先判断 data-model是否可编辑,对于不可编辑的 JComboBox调用编辑函数会丢出 RuntimeException ())

 

TreeModel

 

TreeModel时最复杂的一种 data-model,参考文献一有详细说明

 

 

各类 Text控件

 

各类 Text控件是比较独立的主题,这里不再详述。

参考文献

[1] Understanding the TreeModel :

http://java.sun.com/products/jfc/tsc/articles/jtree/

[2] A Swing Architecture Overview : http://java.sun.com/products/jfc/tsc/articles/architecture/index.html

[3] JGuru Faq:

http://www.jguru.com/faq/

[4] « Swing » by Matthew Robinson & Pavel Vorobiev

Swing MVC体系结构浅析 Swing MVC体系结构浅析1 Swing与MVC<br /><br />  Swing组件设计使用了著名的MVC模型-视图-控制器体系结构。为了了解MVC体系结构与Swing组件的关系,我们来看一下如何设计一个表示按钮的组件,因为按钮的各个部分可以与MVC体系结构的3个部分对应起来。<br />  按钮在任意给定时刻,可处于启用和无效两种状态之一。很显然,按钮只有处于启用状态时才会响应点击。记录按钮状态是很有用的,视图需要根据按钮的状态进行不同的渲染。按钮的所有状态就是MVC体系结构的模型部分。模型还包 阅读详情

相关推荐

从零到一:使用阿里云百炼搭建企业级 AI Agent 完全实战手册(2026超详细版)

本文是一份企业级AI Agent构建手册,主要面向企业技术负责人、AI产品经理和后端开发工程师。手册详细介绍了如何在阿里云百炼平台上搭建企业智能体应用的全流程,包括环境准备、知识库构建、智能体创建、工具集成、工作流编排等核心环节。重点内容包括: 准备工作:阿里云账号注册、百炼服务开通、免费额度领取、API Key管理 知识库构建:文档格式要求、内容优化原则、RAG系统搭建 智能体开发:Agent创建、工具集成、复杂业务工作流设计 生产部署:多渠道接入、监控运维、安全治理 成本控制:Token预算管理、选型决

u010323587的专栏 1083

Swing框架之Model

构建应用程序应该以数据为中心,而不是以用户界面为中心,这是一个良好的编程习惯。为支持这种编程范式,Swing为每种带有逻辑数据或值的组件定义了独立的模型接口,这种分割使程序可以选择向Swing组件中嵌入自己的模型实现。       下面表格列出Swing中组件及其模型的映射关系: 组件 Model接口 Model类型 JButton ButtonModel GUI

expleeve 1608

ASPICE1-配置管理

SUP.8配置管理 BP1:开发配置管理策略 BP2:识别配置项 BP3:建立配置项管理系统 BP4:建立分支管理 BP5:控制变更和发布 BP6: 建立基线 BP7:报告配置项状态 BP8:验证配置项信息 BP9:管理配置项和基线的存储 1.配置管理概念 配置管理(Configuration Management,CM)是通过使用技术或行政手段对软件产品进行控制,以实现对软件开发过程和生命周期进行控制、规范的一系列措施。 完整性、一致性、可控性。 2.配置管理的主要活动: 1.

HDZQ2005的专栏 3687

swing学习——Model

swing 组建的Model 大多数Swing组件都有自己的Model JButton---->ButtonModel:记忆了Button是否可选,可以被点击等等 JList---》ListModel持有了List的所有组件 JList--》SelectionModel跟

Dean_Deng的专栏 683

基于STM32F407VET6的智能巡检小车灰度循迹系统优化设计

本文详细介绍了基于STM32F407VET6主控芯片的智能巡检小车灰度循迹系统优化设计。通过将传感器输出从数字量升级为模拟量以获取更丰富的路面信息,并采用PD控制算法结合速度管理策略,有效提升了小车在复杂弯道上的循迹稳定性与适应性。文章分享了硬件电路抗干扰设计、软件滤波及实战调优经验,为嵌入式开发者提供了从“能跑”到“跑得稳”的系统性解决方案。

weixin_28273593的博客 443

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4220

idea的Java窗体可视化工具Swing UI Designer的简单使用(一)

0、问题总结 Warning:java: 源值1.5已过时, 将在未来所有发行版中删除: Error:java: Compilation failed: internal java compiler error: 1、窗体的初使用 创建GUI Form 注意使用这个关闭模式: 使用 jFrame.pack(); 替换 jFrame.setSize(800,400); 。。。可以很好的包裹住界面。。 设置窗体的icon图标: 绝对路径: jFrame.setIconImage(new Ima

白白旧维的博客 7万+

问题:dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)

 1. 问题:Ubuntu安装软件的过程中出现依赖项的问题 “E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).” 按照指示执行如下两条命令都没有解决问题。 sudo apt-get -f install sudo apt-get --fix-broken ...

gloria_littlechi的博客 2万+

Qt Designer设计 UI 文件并调用

QtDesigner设计 UI 文件并调用是本篇内容将要介绍的内容,不多说,先来看内容。 1、用designer设计一个UI.对象名保存为myui,基于QWidget类.(可以在此基础上随便添加一些控件之类。eg:pushButton)。保存窗体为myui,or others. 2、为了明白其具体机制,我们可以用uic将此UI文件转换成头文件看看。uic -o ui_myui.h myui.u

zyf7862634的专栏 1155

DA14531-外设驱动篇-UART收发通信应用

宏定义注解CFG_PRINTF用户开启串口串口打印宏设置波特率选择115200。

hejinwu1314的博客 729

QT实现ftp服务器(附完整源码)

QT实现ftp服务器(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1783

Understanding Swing’s Model (转)

Understanding Swing’s Model (转)[@more@] Understanding swing’s Model XML:namespace prefix = o ns = "urn:schema...

ciya3282的博客 89

VT-Refine:基于仿真微调的视觉-触觉反馈双臂装配强化学习

本研究提出VT-Refine框架,通过融合真实世界示范、高保真触觉仿真与强化学习,解决高精度双臂装配任务。方法分为两阶段:首先利用少量人类示范数据预训练视觉-触觉扩散策略;随后在数字孪生仿真环境中进行强化学习微调。关键创新包括:开发GPU加速的触觉仿真模块精确模拟压阻式传感器;采用基于点云的多模态表征实现无缝的跨领域迁移。实验表明,该方法在五个双臂装配任务中显著提升性能,触觉反馈使成功率提高40%。研究首次实现仿真环境中的大规模双臂视觉-触觉强化学习及sim-to-real迁移,为接触密集型任务提供了新解决

2506_90492529的博客 1795

大型CAx(CAD/CAE/CAPP/CAM)工业软件开发中的关键组件

通过对FreeCAD、SALOME等多款代码的分析研究,发现这些软件在架构设计、模块实现等方面,存在许多相似(同)的技术思想。因此,有必要对这些共性、主流的技术予以总结分析。

国产CAx(CAD/CAE/CAM)软件研发 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

词根记录(1)

merge沉没 合并 emerge 出现 浮现 merg词根是合并的意思, merge两个合并就是相互沉入其中,淹没其中。e是否定的意思 不去合并淹没就是浮现出现。ign词根 光 火的意思,ignite点亮 点燃;代表光线笼罩的一户人家。caliber ˈkæləbər 口径 水准 质量,卡口。bust弄碎 打坏,降级 阻止。

lxlmycsdnfree的博客 2083

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Swing界面实现全局抗锯齿

问题背景 在用Swing开发一个GUI程序,对界面设置字体后无论怎样字体都会有严重的锯齿,例如下图的字体 解决方案 在初始化JFrame之前,先调用如下代码即可。注意:在初始化JFrame之前调用,在初始化JFrame之前调用,在初始化JFrame之前调用!!!否则不起作用!!! // 全局字体抗锯齿,必须在初始化 JFrame 之前调用! static voidenableAntiAliasing() { System.setProperty("awt.useSystemAAFontSettin

Doge的技术小屋 1608

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jigloo插件简介

jigloo插件简介一 3大GUI开发插件的特色   Eclipse并不自带GUI的可视化开发工具,那么如果要在Eclipse进行可视化的GUI开发,就需要依靠第三方的插件。 1. Visual Editor    Eclipse官方提供了一个叫做Visual Editor(VE)的开源GUI插件,功能还是比较强。可以根据用户的界面GUI设计,自动生成相应的JAVA代码。同样也可以

Liang Tang's 专栏 1万+

Intellij插件之~图形界面Swing UI Designer

Swing UI Designer

AdrianAndroid的专栏 4071

idea的Java窗体可视化工具Swing UI Designer的简单使用(二)

11、选择文件夹组件 通过按钮来打开窗口,绑定一个事件: 生成文件选择器窗口: JFileChooser ff = new JFileChooser("d://workplace"); ff.setFileSelectionMode(JFileChooser.FILES_ONLY);//只有文件能选 int result = ff.showDialog(null, "请选择文件"); if(result==JFileChooser.APPROVE_OPTION){ System.ou

白白旧维的博客 1万+

视图的相互调用Swing

使用一个视图打开另一个视图,完成操作后又返回到上一个视图(视图的相互调用Swing) 第一步 在视图一中定义按钮响应,打开视图二 视图一内View1 actionPerformed()方法内 else if (e.getSource() == this.itemAccount) { View2 view2 = new View2 (); view2.setVisible(true); this.dispose(); } 第二步 视图二中定义按钮响应,打开视图一 视图二内View

一条菜鸟鱼的博客 368

java swing开发窗体程序开发(四)MVC结构

MVC是一种设计结构(非设计模式,非设计原则) M:Model 模型层:即用于存储数据的对象 V:View 视图层:即用于为模型提供数据显示的对象 C:Controller 控制器层:即处理用户的业务逻辑(交互操作),对用户的操作做出相应,让模型和视图进行必要的交互。 在java swing中可以理解为 将某个对象视为“模型”,然后为该“模型”提供恰当的显示组件,即“视图”,为了响应用户的操作,让...

(˶˚ ᗨ ˚˶)来康康我 4121

swing实现MVC模式实现增删改查+排序系统3.0【java基础---图形界面----swing实现MVC模式】

swing实现MVC模式实现增删改查+排序系统3.0【java基础---图形界面----swing实现MVC模式】

伟庭的博客 1189

Java Swing 框架入门,打造一个属于自己的MVC架构

Java Swing 框架入门,打造一个属于自己的MVC结构 开发工具与关键技术:java、 elipse2019、jdk1.8 作者:Amewin 撰写时间:2019年8月7日 Swing编程简介 Swing开发的图形界面AWT跟家轻量级,使用100%的java开发不再依赖本地图形界面可以在所有平台保持相同的运行效果。 优点: 1、Swing组建不再依赖本地平台GUI无需采用各种平台的GU...

Amewin的博客 2496
上一篇: Creating Interactive GUIs with Swing's MVC Archite
下一篇: [Swing]JTable 表头显示问题收藏
topinking
博客等级 码龄20年 15粉丝 242原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值