当前位置: 首页 > 工具软件 > AsWing > 使用案例 >

AsWing组件介绍

丁理
2023-12-01
 

组件知识点:

1.       JPanel:JPanel是AsWing 中最常用的容器组件,它是Container的直接子类,通常作为

透明或非透明容器用(setOpaque 方法可以设置它的透明属性)。

2.       JWindow:JWindow 是AsWing 中常用的窗口组件,它是JPopup 的子类,可以做弹出

窗口用,对于单窗口程序,它也可以作为根组件使用。

3.       JLabel:JLabel 是标签组件,它用于显示一个字符串。

4.       LineBorder:线框,用于在组件周围绘制一个矩形边框。

5.       JToolBar:JToolBar 是一个工具栏容器,它可以横向或者竖向排列加入其中的组件,并会使得加入其中的按钮具有一般应用程序工具栏按钮的效果,即鼠标滑过时弹起,滑开时隐藏按钮边框,鼠标在按钮之上时按钮保持通常的行为。

6.       JButton:JButton 是普通按钮组件,它继承自AbstractButton,拥有AbstractButton 的所有行为和方法以及事件。除了JButton,还有开关按钮JToggleButton,单选按钮JRadioButton,复选框JCheckBox 等都是AbstractButton 的子类。

7.       JMenuBar:菜单条唯一的作用是容纳菜单,菜单作为Component 的子类,理论上可以

放置于任何一个Container 及其子类中,但是菜单条不仅仅提供对菜单的包含作用,它还提供了菜单的键盘导航作用——选中任何一个菜单时按左右键可以在同级别其他菜单中切换。

8.       JMenu:菜单是菜单项(JMenuItem)的子类,因此菜单也拥有菜单项的所有功能,如

果把JMenuItem 比作Component,JMenu 就好比Container。菜单还可以包含菜单(子菜单)。然后菜单并不是一个正规的Container,他对菜单项的容纳是通过一个JPopupMenu 来实现的,因为菜单非选择状态下并不需要显示出它的子项,只有在选中时,才弹出一个包含了其子项的JPopupMenu。

9.       JMenuItem:菜单项是AbstractButton 的子类,所以菜单项的行为和按钮行为一样,所

拥有的方法也大体相同。当然,AsWing 也提供了单选菜单JRadioButtonMenuItem 和复选菜单JCheckBoxMenuItem,它们的行为与JRadioButtonJCheckBox 一样。

10.    JTable:数据表格组件,在一些组件库中,它也被命名为DataGrid。在AsWing 中,JTable

由TableMode l 提供数据,JTable 本身实现了Viewportable 接口,因此可以直接被JScrollPane包含,拥有滚动功能。JTable 是一个大型组件,拥有很多操作接口。

11.    Table Model:表格模型,它是JTable 的数据提供者。它通过自身的接口提供表头,各行列数据,并在数据发生更改时发出事件。TableMode l 是一个接口,因此任何完整的实现都可以用于向JTable 提供数据, AsWing 自带的实现有DefaultTableModel 和

PropertyTableModel。

12.    PropertyTableModel:这是一个TableMode l的实现。常常用于把一个对象列表中的对象数据,以对象为行,以对象属性为列来显示,它提供默认方式把属性值以直接字符串化显示,也提供转换器(PropertyTranslator 或Function)把值转换成期望的字符串格式来显示。

13.    Table Column:它是JTable 中的一个列。通常不必手动创建它,当JTable 创建时,或者数据模型列数改变时,相应的TableColumn 就会被创建,通过JTable 的getColumnAt 或者getColumn 方法可以得到指定的TableColumn 对象, 常用的TableColumn 的方法为setPreferredWidth,设置它相对于默认值75 的大小,各列不同的期望宽度形成一个比例关系,JTable 根据这个比例关系来分配初始化时各列的宽度。

14.    Table Sorter:表格排序器。它是TableMode l 接口的一个实现,通过包装一个现有的

TableMode l 来实现排序。实现原理为:以选择排序方式为基准,变换原始TableMode l 类的行的值,以达到变换行顺序的目的。排序所采用的值比较函数,可以通过给指定列设定列类型,然后给指定列类型设定比较函数来达到。默认情况下,所有列的类型都是Object 类型,TableSorter 自带String 和Number 类型的比较函数,对于没有指定比较函数的列,默认将采用String 类型的比较函数。

15.    columClass:列类型。它属于TableModel 的内容,主要目的是为了让不同类型的列能使用格子的排序比较函数和单元格渲染方式。

16.    Table Cell:表格单元格接口。表格界面是由表头+单元格+分界线组成,单元格负责描绘数据单元。默认情况下,表格采用PoorTextCell 单元格,负责把单元格值以字符串文本的形式描绘出来。如果开发者需要改变描绘方式,比如用特殊的颜色,或者用图形,或者用其他组件如选择框,下拉框,都可以通过实现自己的TableCell 来达到。TableCell 最主要的两个接口是setCellValue(value:*) : void 和setTableCellStatus(table :JTable,selected : Boolean, row : int, column : int) : void,前者意为给单元格设置要描绘的值,后者意为设置单元格的状态,通常,在前者中为单元格组件设置要描绘的内容,在后者为单元格组件设置字体和颜色。另外,getCellComponent( ) : Component 接口则是返回要描绘单元格的组件。读者可以参考AsWing 自带的PoorTextCell 和DefaultTableCell 两个类来研究单元格的实现方法。理论上,任何组件都可以作为单元格组件,因此,AsWing 的表格拥有极其灵活的表现方式,你可以在单元格里放置一个拥有大量组件的容器,或者一个树,甚至是表格——形成表格中的表格。

17.    TableCellFactory :单元格工厂。产生单元格实例的工厂, 通常使用

GeneralTableCe llFactory 即可,单元格工厂只是用来创建单元格实例的类,因此并不复杂,可以参考GeneralTableCe llFactory 类的源代码理解其意义。

18.    columClass:列类型。

19.    Selection Event:选择事件。表格的行,列(以及列表List)共用的选择事件类。

SelectionEvent.ROW_SELECTION_CHANGED 事件代表行的选择改变时发出的事件,相应的SelectionEvent.COLUMN_SELECTION_CHANGED 则代表列的选择改变时发出的事件, 默认情况下,表格JTable 是关闭了行选择功能( 如果需要,可以通过JTable.setColumnSelectionAllow ed(true) 来开启它)。由于我们的表格设计为每行显示一个日程,因此当行选择改变时,我们就能通过行号来获取到选中的日程。注意,由于我们使用了TableSorter 来进行排序,因此显示出来的行的顺序可能和数据模型中顺序不同,因此需要通过TableSorter.modelIndex 方法来进行转换才能得到实际数据模型中的对应的行。

20.    处理函数:在TaskManager 中,我们实现了一个日程改变的处理函数的逻辑,这是为了封装表格事件与模型的关联细节,对外只暴露出一个处理函数,方便外部简单获得需要的数据,从TaskDetailsController 的简洁即可看出这种方式的便利性。但是这种方式也把处理函数局限到只能有一个的境地,如果还有其他控制器需要处理日程选择的改变事件,那么此方法必须改进,可以通过维护一个处理器列表,把设置处理器改为添加和移除处理器的方式,允许多个处理器同时存在,来达到目的。当然,也可以更传统地让TaskManager 继承或含有EventDispatcher,用事件的方式来实现。

21.    界面更新:对于标准的MVC 模式的组件,只需要通知Model 某些数据改变了,Model

会自己广播事件给Controller,Controller 则会根据事件内容对View 做内容更改,因此界面更新工作非常简单。比如本节对TaskManager 添加的notifyTaskChanged 函数中的第一句,它通知列表模型某个Task 更改了,然后表格自动就会显示出更改后的新内容,这是因为列表模型通知了包含它的表格模型(PropertyTableModel),表格模型会发出事件告诉表格的控制器,然后表格控制器则会对表格界面进行更新,这一过程已经在AsWing 的JTable及相关类中实现好了,用户使用起来不用关心其中的细节。而对于我们自己编写的日程细节显示部分,这并不是一个MVC 模式的实现,由于其功能简单,并且不需要复用,因此我们也没必要大费周折的把它用MVC 来实现一次,我们只需要在notifyTaskChanged 函数中用了一个if 判断,然后再借用__rowSelectionChanged 现有的逻辑,即实现了更新它的界面的能力。

22.    组件有效性设置:为了提升用户感受,我们通常只让能用的组件处于可点击状态,比如

本节对编辑日程按钮及菜单的设置,当没有选中任何日程时,它们不应该处于有效状态,这会误导用户,而当有日程被选中时,它们则应该立刻变为有效状态,这些,一般可以通过监听选择更改事件来进行处理。本节通过改进上一节自制的日程改变处理函数的功能,达到了这个目的。当然,像上一节提到的一样,你也可以用更通用的Event 方式来实现,同样可以达到这样的目的。

23.    Cell Editor:单元格编辑器,它是一个接口,任何完整实现了此接口的类,都是一个单元格编辑器,而不同的组件通常还有自己专属的单元格编辑器子接口,比如表格的单元格编辑器是需要完整实现TableCellEditor 的(当然它也是CellEditor 的子类,对应,树的单元格编辑器接口是TreeCellEditor ),但是就目前版本的AsWing 实现中, TableCellEditor 和TreeCellEditor 都没有附加的方法,因此它们的各自的实现,是可以轻松共用的。本节中使用了AsWing 自带的DefaultNumberTextFieldCellEditor 来编辑时长,是因为时长是数字类型;用DefaultComboBoxCellEditor 来编辑状态,并填入状态数组,是因为状态是几个字符串值的枚举。AsWing 除了自带这两个编辑器外,还有一个用于编辑字符串的DefaultTextFieldCellEditor。对于一个特定类型属性的编辑,一定要配上对应的编辑器,否则编辑器返回的值类型不同,程序则会出错,读者可以试着把本节的3,5 列编辑器对调,然后运行程序试试看是什么后果。

对于无法采用AsWing 自带编辑器来编辑的属性,开发者必须自己实现对应的编辑器,

这里举日程开始时间属性为例,虽然表现形式是一个字符串,但是实际的值是Date 类型,因此不能采用DefaultNumberTextFieldCellEditor 或DefaultTextFieldCellEditor,虽然DefaultComboBoxCellEditor 理论上可以支持任何类型,但是我们不能枚举所有的时间。

24.    JToolTip :工具提示组件, 通常并不直接创建此类的实例, 而是采用

Component.setToolTipText 方法给组件设置提示文字,此方法的内部实现实际上是使用了一个共享的工具提示组件来显示提示,因为通常并不会有多个提示同时出现,所以采用一个共享的实例有助于节约内存。但是,当需要自定义工具提示的一些特性时,则需要自己创建甚至继承JToolTip,JToolTip 是Container 的直接子类,因此开发者还可以把它当作容器添加额外的内容。JToolTip 最重要的方法是setTargetComponent,它用来设置工具提示的宿主,使得工具提示就明白在哪里显示,在何层显示,因此在创建JToolTip 的时候,必须调用它设置宿主,然后工具提示才可能正确工作。此外, JToolTip 还可以设置提示框显示坐标是相对于组件位置还是当前鼠标位置,位置偏移量等,具体请查阅api 文档。

25.    JSharedToolTip:共享工具提示组件,由于工具提示通常并不需要同时显示多个,因此如果多个组件需要提示时,可以共用同一个工具提示,此类正是为此而诞生的。

Component.setToolTipText 方法内部其实就是使用了此类来实现的。当需要给一个组件设置工具提示时,调用registerComponent 方法注册, 当需要移除时,调用

unregisterComponent。JShared ToolT ip.getShared Instance 静态方法始终返回同一个实例,因此需要全局共享工具提示组件时,即可调用此方法得到全局共享的实例。

26.    背景色:在AsWing 中,每个组件都必有两个颜色属性,前景色和背景色,前景色通常

代表组件的文字颜色,背景色代表底色,可以通过setForeground 和setBackground 来设置它们。与背景色相关联的还有不透明属性——opaque,有的组件默认是透明的,有的不是(视不同的LookAndFeel 而定,后面章节会进行介绍),如果要确定背景色是否有效,可以调用setOpaque 方法设定是否不透明。

27.    ASColor:颜色类,含有rgba 属性的类,此类为immutable 特性的类,即一经创建,属性就不会再变化,与String 类型一样。因此如果要改变一个组件的颜色,必须设置另一个颜色对象。不同的颜色对象,可能具有相同的颜色属性,比较两个颜色是否相同,可以用ASColor.equals 方法来进行判断。

28.    边框(Border):组件的边框,通常大部分组件的默认边框都为null,即没有边框。开发者可以通过给组件设置边框来修饰界面。Border 是一个接口,借此开发者可以实现任意自己想要的边框类型。通常,LookAndFeel 会给一些组件用设置边框的方式来进行修饰,这时如果你给这种组件设置了另外的边框,则会影响它原来的外观,你可以通过getBorder() isUIResource 来判断现有边框是否为LookAndFeel 的UI 资源。实现自己的边框类方式和实现一个Icon 类似,可参考下一节自定义Icon 相关内容。

常用的边框:AsWing 自带有7 个常用的边框类,分别是:

 类似资料: