aswing组件知识点 组件知识点: 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,它们的行为与JRadioButton 和JCheckBox 一样。 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 个常用的边框类,分别是: BevelBorder:斜边边框。此边框通常用来构建凹陷或凸起效果 CaveBorder:凹穴边框,此边框是由TitledBorder 去掉标题文本简化而来的,它表现为一个高亮线条框,可以直角也可以圆角 LineBorder:线条边框,此边框表现为指定颜色,线条宽度,圆角跨距的线框 SideLineBorder:单边线条边框,有时候只需要在组件的某一边有一条线,比 如分割线,就可以使用此边框 SimpleTitledBorder:简单标题边框,此边框在组件上方或者下方显示一段文 字,可作为一些组件面板的标题 TitledBorder:带有标题和高亮线框的边框,这可能是最常用的 EmptyBorder:空边框,空边框看似什么都不做,其实用处非常广泛,因为它是空的,所以常常用于制造空隙,比如一个文本标签,它的期望大小是刚刚能完全显示文本字符串的大小,如果想让它上下左右拥有各4 个像素的空白,那么可以给这个标签设置这样的边框new EmptyBorder(null, new Insets(10, 10, 10, 10))。 29. 图标(Icon):在AsWing中,所有AbstractButton 都能设置图标,包括按钮,单选复选框,菜单等等,并且不同的状态还可以设置不同的图标。图标接口共有4 个方法,要实现自己的图标类并不难,不过通常使用LoadIcon 或AttachIcon 或者直接使用AssetIcon 已能达到大部分的需要(与美术设计师创造的图形资源配合)。与Border 不同的是,LookAndFeel 通常不会给组件设置图标来修饰组件(JFrame 的默认图标除外)。 30. AssetIcon:元件图标,通过一个元件实例创建的图标,图标元素就是传入的元件本身。 构造函数形式为AssetIcon(asset:DisplayObject=null, int=-1, height:int=-1,scale:Boolean=false),第一个参数为图标的元件,它可以是任何DisplayObject 对象,位图Bitmap 或者动画MovieClip 等都可以,width 和height 指定图标的宽高,如果用默认值-1,那么它会采用元件的width 和height 属性,最后一个参数scale,是指当指定的宽高和元件本身宽高不等时,是否需要缩放元件到指定的宽高值。 31. Attach Icon:图标(Icon):在AsWing中,所有AbstractButton 都能设置图标,包括按钮,单选复选框,菜单等等,并且不同的状态还可以设置不同的图标。图标接口共有4 个方法,要实现自己的图标类并不难,不过通常使用LoadIcon 或AttachIcon 或者直接使用AssetIcon 已能达到大部分的需要(与美术设计师创造的图形资源配合)。与Border 不同的是,LookAndFeel 通常不会给组件设置图标来修饰组件(JFrame 的默认图标除外)。 32. AssetIcon:元件图标,通过一个元件实例创建的图标,图标元素就是传入的元件本身。 构造函数形式为AssetIcon(asset:DisplayObject=null, int=-1, height:int=-1,scale:Boolean=false),第一个参数为图标的元件,它可以是任何DisplayObject 对象,位图Bitmap 或者动画MovieClip 等都可以,width 和height 指定图标的宽高,如果用默认值-1,那么它会采用元件的width 和height 属性,最后一个参数scale,是指当指定的宽高和元件本身宽高不等时,是否需要缩放元件到指定的宽高值。 33. AttachIcon:绑定元件图标,它是AssetIcon的子类,通过指定元件类名和程序域创建 元件实例,并用此实例作为图标元素。 34. LoadIcon:加载资源图标,也是AssetIcon的子类,通过加载指定路径下的一个元件资 源来作为图标元素。 35. LoadIcon:加载资源图标,也是AssetIcon的子类,通过加载指定路径下的一个元件资 源来作为图标元素。 36. GroundDecorator:前景/背景装饰器,由于所有组件都可以拥有一个前景装饰器,一个背景装饰器,因此在装饰一个组件时,它是最好的选择,比如你要让一个窗口的底层显示一个动画,那么用yourWindow.setBackgroundDecorator(new AssetBackground(yourMovie));即可达到。 37. AsWing 组件可以随意的添加任何显示元件,这和Flex 界面框架不同,Flex 界面框 架要求被添加的显示元件必须实现IUIComponent 接口,给开发人员与美术设计人员之间的配合带来了诸多不便。 直接添加显示元件:虽然AsWing 组件没有限制往内添加任何显示元件,但是也有需要 注意的地方。比如上例中关于遮罩的问题,和JFrame 一样,所有组件默认都是被遮罩的,如果你的图形内容需要超出组件范围,那么就需要取消遮罩,但是要谨慎使用,取消遮罩也就意味着这个组件的图形可能会超出自己的范围从而与其他组件相叠。并且,对于JFrame,取消掉遮罩还意味着最小化的时候组件的contentPane 会暴露出来,因为遮罩失效了,最小化时contentPane 不会被遮起。通常的解决方法是,要么对这样的JFrame 取消最小化功能,要么监听最小化事件,在最小化之后把contentPane 设置为不可见(setVisible(false))。另外,如果你添加的元件是一个InteractiveObject,典型的比如一个绑定的MovieClip,它会吃鼠标事件,为了不让其吃掉组件本应该吃的鼠标事件,你应该把它的mouseEnable 和mouseChildren 属性设置为false,除非你故意需要它来吃事件。 38. 自定义光标:光标管理器的方法都非常简单,本节就不再举例了,读者可以自己尝试编 写例子来实验。这里讲讲自定义光标的内部实现细节,AsWing 自定义光标是通过在光标根容器中添加光标元件,并且监听鼠标移动事件来同步元件与鼠标的位置来实现的。光标根容器默认为Stage,你也可以通过setCursorContainerRoot 方法来设置到别的容器内,但注意鼠标根容器应该是处于一个比较根部的位置,以使得鼠标图形元件被添加时,能够始终显示在最上层。 39. 包装SimpleButton:AbstractButton 及其子类都拥有此能力,此能力极好的方便了开发人员直接使用美术设计师创建的按钮元件。它的实现原理,其实是把SimpleButton 按钮元件作为AbstractButton 的Icon,然后根据AbstractButton 的状态变化,设置SimpleButton的状态,实现代码并不复杂,读者可以参阅SimpleButtonIconToggle 类的源代码,观察它的内部实现细节。JButton 覆盖了wrapSimpleButton 并采用了略微不同的实现方式,目的是使鼠标点击范围完全转移到SimpleButton 上,使得包装后的JButton 与原始SimpleButton 的行为更一致。读者如果通过阅读相关代码,理解了包装SimpleButton 的实现原理,那么你也就学会了更深入的修饰AsWing 组件的方法了。 40. JList 是一个实现了Viewportable 的组件,用来显示一个从上到下排列的数据列 }}表,条目单元的显示由ListCell 定义,ListCell 的实例由ListCellFactory 产生, 数据模型由ListModel 提供。JList 拥有的事件比JTable 略多,除了条目选择变化事 件外,还拥有一些列与条目自身相关的事件,比如条目被点击,条目在鼠标移出范围时等,注意,如果要监听条目双击事件,需要给单元格组件(getCellComponent 方法返回的组件)设置doubleClickEnabled=true,否则不会生效。详细的事件定义请参阅相关api文档。 41. VectorListModel是AsWing自带的ListModel 实现,它的行为类似一个Vector, 可以随意在任何位置插入/删除数据,并且在数据改变时,会自动触发对应的事件,使得JList 自动更新界面显示。读者可以尝试给上面的例子程序加入删除/添加条目的功能,观察JList 是否会自动的更新。 42. ListCell定义了JList 的单元格渲染,和TableCell 原理类似,AsWing 自带的 实现有DefaultListCell,它表现为把数据以字符串的方式显示(数据的toString() 方法的返回值将作为显示字符串)。 43. ListCellFactory 是创建ListCell 的工厂,与TableCellFactory 类似,但它 还负责更多的事情,除了创建ListCell 的方法外,它还有: isAllCellHasSameHeight():Boolean 方法,指出此工厂生产的单元格 是否都以相同的高度来显示。如果此方法返回true,那么getCellHeight 返回的值 将作为所有单元格的高度值。 getCellHeight():int 方法,返回所有单元格应该被设置的高度值。仅当 isAllCellHasSameHeight 方法返回true 时有效。 isShareCells():Boolean 方法,指出是否应该共享使用单元格实例,如果此方法返回true,JList 会只创建能够被显示出来的单元格数量(比如JList 高度为100,单元格高度为20,那么单元格实例只会被创建出5 个左右),在JList 滚动的时候,实时给单元格设置滚动后对应的数据;如果此方法返回false,JList 会为每个数据条目创建一个单元格,这样在JList 滚动的时候,就不用再次设置各单元格的数据,只需要调整单元格组件的位置即可。注意,在共享单元格的时候,isAllCellHasSameHeight 返回false 无效, 会始终视为所有单元格都拥有getCellHeight 返回相同的高度值。 44. PreferredSize,关于期望大小,尽管本节我们的例子都给JList 设置了VisibleCellWidth 和VisibleRowCount,但是在通常的程序开发中,笔者很少这样 做,因为通常我们都需要让JList 这样的大组件占满剩余的区域(处于BorderLayout 的Center 位置),由此以来,期望大小就不用在乎,而且,对于非共享Cell 的情况下, JList 会为每个Cell 计算各自的期望宽度,并根据最大的宽度来作为期望宽度,而且, 在需要水平滚动条的时候,则能够自适应出现合理的水平滚动条。之所以让ListCellFactory 有这样的参数,是为了效率和灵活性, JList 拥有比JTable 更大的变化性。比如,上例我们就不能共享单元格,否则每次操作都会重新加载图片,无论是对网络压力还是用户感受,都不利。再者,如果一个列表,含有上万级别的条目数,就最好是采用共享单元格实例的方案,有助于节约内存。另外,允许单元格拥有不同高 度的策略,使得表格能够有更大的变化性,比如可以方便地实现类似QQ2008 风格的好友列表(可参考文章http://www.aswing.org/?p=232)。 45. JTree: 与JList 类似,JTree 的期望大小也需要通过一些列方法的设置来进行调整,它们是: setRowHeight(rowHeight:int):void,设置每一行的高度(默认值为16), JTree 的所有行都拥有相同的高度。这与JList 不同,JList 为了拥有更大的灵活性,把此设定交给了ListCellFactory,并且允许不同的行可以有不同的高度, JTree由于其自身的复杂性,没有提供这样的灵活性,采用这一更利于管理和运行效率的统一高度的策略。 setVisibleRowCount(newCount:int):void,设置期望显示出的行数,它的功能与JList 的同名函数相同。 setFixedCellWidth(int):void,设置-1 指明自适应条目的期望宽度,设置非-1 值指明所有条目采用指定宽度值。此方法与JList 的setVisibleCellWidth 方法含义不完全相同,JList 由于在共享Cell 的时候,无法计算宽度,所以需要设置(非共享Cell 时可以不用设置即可自适应),而JTree 能够计算所有条目的期望宽度,所以除非你想使所有条目拥有共同的一个宽度,否则不需要设置此属性的。 46. JRootPane 和JPopup:JRootPane 是所有根容器(比如JFrame,JWindow,JPopup 等) 的基类,它内部封装了作为一个根容器的键盘管理(KeyboardManager)功能,任何继承自它的容器,都能拥有独立的键盘管理功能,比如快捷助记符(Mnemonic),回车键触发的默认按钮等。JPopup 继承自JRootPane,是一个最原始的弹出容器,它是JWindow 的父类,它作为弹出根容器,最大的特点就是不用显式的被addChild 或者append 到舞台中,只要创建它的实例,然后调用show(或者setVisible(true))方法即可让它显示到舞台上。从前面章节介绍过的JWindow 和JFrame 的使用方法即可看出这一点。 47. AssetPane(JLoadPane, JAttachPane) : 资源面板, 这里的资源是指显示元件 (DisplayObject),前面章节我们讲到过可以通过addChild 添加任意显示原件到AsWing组件中,但是如果你想让所加入的显示原件也能像组件一样的被布局管理器自动布局,那么可以使用AssetPane 来包装这个显示原件。JLoadPane 和JAttachPane 都是AssetPane 的子类。 48. JLabelButton:标签按钮,表现形式就像一个纯文本超级链接,它是AbstractButton 的子类,因此拥有按钮的所有功能。 49. JAdjuster:调节器,用于让用户选择一个范围内的值,也使用BoundedRangeModel, 表现形式为一个输入框,右边一个下拉按钮,点击后会弹出一个滑动条(Slider)。 50. JPopupMenu:弹出菜单,它是一个菜单容器,使用它可以在任何地方弹出一个菜单面板, 51. JMenu 实际上是使用了一个JPopupMenu 来作为子菜单的容器。 52. JSeparator:分隔条,纯界面组件,无实际功能,以一个凹槽条的形式来美化界面需要 的间隔。 53. JSpacer:占位器,无实际功能,通常也无界面表现(全透明),用来在布局管理器中进行占位,也可以起到分割界面的作用。 54. JSplitPane:分割面板,此容器可以容纳两个组件,使其左右/上下分布,中间会有一 个分隔条, 并且用户可以拖动分隔条进行左右/ 上下空间分布的调节。如:弹出菜单,它是一个菜单容器,使用它可以在任何地方弹出一个菜单面板 55. JMenu 实际上是使用了一个JPopupMenu 来作为子菜单的容器。 56. JSeparator:分隔条,纯界面组件,无实际功能,以一个凹槽条的形式来美化界面需要的间隔。 57. JSpacer:占位器,无实际功能,通常也无界面表现(全透明),用来在布局管理器中进行占位,也可以起到分割界面的作用。 58. JSplitPane:分割面板,此容器可以容纳两个组件,使其左右/上下分布,中间会有一 个分隔条, 并且用户可以拖动分隔条进行左右/ 上下空间分布的调节。 59. JColorChooser(JColorMixer,JColorSwatches):颜色选择器,JColorChooser 由两部 分组成,混色器(JColorMixer)和样色板(JColorSwatches),并且它们也是可以单独使用的组件。 60. Folder:纸夹,它是一个拥有标题条的容器,并且点击标题条可以展开或收缩内容面板。 61. GridList:格子列表,它是列表组件表现形式的扩展,拥有多行多列,并且也可以自定 义单元格。可以用于按行排列多个列的内容,并且支持自动换行的效果,而且,它实现了Viewportable 接口,可以被JScrollPane 友好包装。 |