`
jinxinhero
  • 浏览: 26754 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Flex4实现分组框GroupBox

    博客分类:
  • UI
阅读更多


 分组框(Group Box)是围绕在一组相关控件周围的带标签的矩形边框。它提供了一种通过视觉展示控件关系

的方法。如下图所示:

 

本文将通过以下几步来实现:

一、继承SkinnableContainer,创建组件类GroupBox。

二、声明外观部件titleDisplay用来显示组合框的标题。
三、增加title属性。
四、覆盖partAdded方法,使标题字符串能够作用于外观部件titleDisplay。
五、创建它的默认外观(皮肤)GroupBoxSkin。
六、为GroupBox增加必要样式。
---------------
一、继承SkinnableContainer,创建组件类GroupBox。

public class GroupBox extends SkinnableContainer
{
 public function GroupBox()
 {
  super();
 }
}

 


二、声明外观部件titleDisplay用来显示组合框的标题。

[SkinPart(required="false")]
public var titleDisplay:TextBase;

 

 

三、增加title属性。

 

private var _title:String = "";
[Bindable]
public function get title():String 
{
 return _title;
}
public function set title(value:String):void 
{
 _title = value;
 
 if (titleDisplay)
  titleDisplay.text = title;
}

 
四、覆盖partAdded方法,使标题字符串能够作用于外观部件titleDisplay。

override protected function partAdded(partName:String, instance:Object):void
{
 super.partAdded(partName, instance);
 
 if (instance == titleDisplay)
 {
  titleDisplay.text = title;
 }
}

 
至此,GroupBox组件类基本创建完成,但是还不能显示。下面来创建它的默认外观(皮肤)GroupBoxSkin。
五、创建它的默认外观(皮肤)GroupBoxSkin。
 第一步,创建组合框的边框。

 <!-- 边框 -->
 <s:Rect id="border" left="0" right="0" top="10" bottom="0" 
   radiusX="4" radiusY="4"
   >
  <s:stroke>
   <s:SolidColorStroke id="borderStroke" weight="1"/>
  </s:stroke>
 </s:Rect>

 

 第二步,创建外观部件titleDisplay。

 <!-- 标题 -->
 <s:Label id="titleDisplay"
    maxDisplayedLines="1"
    left="9" top="0"
    minHeight="20"
    verticalAlign="middle" 
    textAlign="start"/>

 
 第三步,创建外观部件contentGroup,用于包含组合框的内容。

 <!-- 内容区域 -->
 <s:Group id="contentGroup"
    left="5" right="5" top="21" bottom="5">
  <s:layout>
   <s:VerticalLayout/>
  </s:layout>
 </s:Group>  

 

 注意,此时边框是一个闭合的矩形。

 

 

 

 图2
 从上图,可以看出现在组合框的标题文字与边框是重叠的,显然这不符合我们的要求。
 为了解决这个问题,下面要为边框创建一个遮罩。
 

<!-- 边框遮罩 -->
 <s:Group id="borderGroupMask" left="0" right="0" top="0" bottom="0">
  <s:Rect left="0" width="7" top="0" bottom="0">
   <s:fill>
    <s:SolidColor color="#ff0000" alpha="1"/>
   </s:fill>
  </s:Rect>
  <s:Rect left="7" width="{titleDisplay.width+4}" top="30" bottom="0">
   <s:fill>
    <s:SolidColor color="#ff0000" alpha="1"/>
   </s:fill>
  </s:Rect>
  <s:Rect left="{titleDisplay.width+11}" width="100%" top="0" bottom="0">
   <s:fill>
    <s:SolidColor color="#ff0000" alpha="1"/>
   </s:fill>
  </s:Rect>
 </s:Group>

 

 

 

 为<s:Rect id="border"/>增加属性:mask="{borderGroupMask}"。
六、为GroupBox增加必要样式。
 第一步,在GroupBox类中增加以下样式声明,它们用来指定边框的颜色和圆角。
 增加borderColor样式。

 [Style(name="borderColor", type="uint", format="Color", inherit="no", theme="spark")]
 [Style(name="cornerRadius", type="Number", format="Length", inherit="no", theme="spark")]

第二步,在GroupBoxSkin中覆盖updateDisplayList,把样式应用于外观。

 

 

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
 {
  var cr:Number = getStyle("cornerRadius");
  if (cornerRadius != cr)
  {
   cornerRadius = cr; // 取变量
   border.topLeftRadiusX = cornerRadius;
   border.topRightRadiusX = cornerRadius;
   border.bottomLeftRadiusX = cornerRadius;
   border.bottomRightRadiusX = cornerRadius;
  }
  
  borderStroke.color = getStyle("borderColor");
  borderStroke.alpha = getStyle("borderAlpha");
  //
  super.updateDisplayList(unscaledWidth, unscaledHeight);
 }

 

至此所有工作完成。效果如下:

图3

图3
完整的文件如下:
1 GroupBox.as

package jx.components
{
	import spark.components.SkinnableContainer;
	import spark.components.supportClasses.TextBase;
	/**
	 *  The alpha of the border for this component.
	 *
	 *  @default 0.5
	 * 
	 *  @langversion 3.0
	 *  @playerversion Flash 10
	 *  @playerversion AIR 1.5
	 *  @productversion Flex 4
	 */
	[Style(name="borderAlpha", type="Number", inherit="no", theme="spark")]
	
	/**
	 *  The color of the border for this component.
	 *
	 *  @default 0
	 * 
	 *  @langversion 3.0
	 *  @playerversion Flash 10
	 *  @playerversion AIR 1.5
	 *  @productversion Flex 4
	 */
	[Style(name="borderColor", type="uint", format="Color", inherit="no", theme="spark")]
	/**
	 *  The radius of the corners for this component.
	 *
	 *  @default 5
	 * 
	 *  @langversion 3.0
	 *  @playerversion Flash 10
	 *  @playerversion AIR 1.5
	 *  @productversion Flex 4
	 */
	[Style(name="cornerRadius", type="Number", format="Length", inherit="no", theme="spark")]
	
	public class GroupBox extends SkinnableContainer
	{
		public function GroupBox()
		{
			super();
		}
		//----------------------------------
		//  titleField
		//---------------------------------- 
		
		[SkinPart(required="false")]
		
		/**
		 *  定义容器中标题文本的外观的外观部件。
		 *
		 *  @see jx.skins.GroupBoxSkin
		 *  
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion Flex 4
		 */
		public var titleDisplay:TextBase;
		
		
		//----------------------------------
		//  title
		//----------------------------------
		
		/**
		 *  @private
		 */
		private var _title:String = "";
		
		/**
		 *  @private
		 */
		private var titleChanged:Boolean;
		
		[Bindable]
		
		/**
		 *  标题或者说明。
		 *  @default ""
		 *  @langversion 3.0
		 *  @playerversion Flash 10
		 *  @playerversion AIR 1.5
		 *  @productversion Flex 4
		 */
		public function get title():String 
		{
			return _title;
		}
		
		/**
		 *  @private
		 */
		public function set title(value:String):void 
		{
			_title = value;
			
			if (titleDisplay)
				titleDisplay.text = title;
		}
		override protected function partAdded(partName:String, instance:Object):void
		{
			super.partAdded(partName, instance);
			
			if (instance == titleDisplay)
			{
				titleDisplay.text = title;
			}
		}		
	}
}

 
2 GroupBoxSkin.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
		xmlns:mx="library://ns.adobe.com/flex/mx" 
		xmlns:s="library://ns.adobe.com/flex/spark" 
		xmlns:fb="http://ns.adobe.com/flashbuilder/2009" 
		alpha.disabled="0.5">
	<fx:Metadata>
		[HostComponent("jx.components.GroupBox")]
	</fx:Metadata> 
	
	<fx:Script fb:purpose="styling">
		static private const exclusions:Array = ["titleDisplay", "contentGroup"];
		
		/**
		 * @private
		 */  
		override public function get colorizeExclusions():Array {
			return exclusions;
		}
		
		/**
		 * @private
		 */
		override protected function initializationComplete():void
		{
			useChromeColor = true;
			super.initializationComplete();
		}
		private var cornerRadius:Number;		
		/**
		 * @private
		 */
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
		{
			var cr:Number = getStyle("cornerRadius");
			if (cornerRadius != cr)
			{
				cornerRadius = cr;	// 取变量
				border.topLeftRadiusX = cornerRadius;
				border.topRightRadiusX = cornerRadius;
				border.bottomLeftRadiusX = cornerRadius;
				border.bottomRightRadiusX = cornerRadius;
			}
			
			borderStroke.color = getStyle("borderColor");
			borderStroke.alpha = getStyle("borderAlpha");
			//
			super.updateDisplayList(unscaledWidth, unscaledHeight);
		}
	</fx:Script>
	
	<s:states>
		<s:State name="normal" />
		<s:State name="disabled" />
	</s:states>
	<!-- 边框遮罩 -->
	<s:Group id="borderGroupMask" left="0" right="0" top="0" bottom="0">
		<s:Rect left="0" width="7" top="0" bottom="0">
			<s:fill>
				<s:SolidColor color="#ff0000" alpha="1"/>
			</s:fill>
		</s:Rect>
		<s:Rect left="7" width="{titleDisplay.width+4}" top="30" bottom="0">
			<s:fill>
				<s:SolidColor color="#ff0000" alpha="1"/>
			</s:fill>
		</s:Rect>
		<s:Rect left="{titleDisplay.width+11}" width="100%" top="0" bottom="0">
			<s:fill>
				<s:SolidColor color="#ff0000" alpha="1"/>
			</s:fill>
		</s:Rect>
	</s:Group>
	<!-- 边框 -->
	<s:Rect id="border" left="0" right="0" top="10" bottom="0" 
			radiusX="4" radiusY="4"
			mask="{borderGroupMask}"
			><!--mask="{borderGroupMask}"-->
		<s:stroke>
			<s:SolidColorStroke id="borderStroke" weight="1"/>
		</s:stroke>
	</s:Rect>
	<!-- 标题 -->
	<s:Label id="titleDisplay"
			 maxDisplayedLines="1"
			 left="9" top="0"
			 minHeight="20"
			 verticalAlign="middle" 
			 textAlign="start"/>
	<!-- 内容区域 -->
	<s:Group id="contentGroup"
			 left="5" right="5" top="21" bottom="5">
		<s:layout>
			<s:VerticalLayout/>
		</s:layout>
	</s:Group>        
</s:SparkSkin>

 
3 GroupBoxExam.mxml 实例文件

 

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:components="jx.components.*">
	<s:layout>
		<s:BasicLayout/>
	</s:layout>
	<fx:Declarations>
	</fx:Declarations>
	<components:GroupBox skinClass="jx.skins.GroupBoxSkin" title="用户配置文件" cornerRadius="5">
		<components:layout>
			<s:HorizontalLayout/>
		</components:layout>
		<s:Button/>
		<s:Button/>
		<s:Button/>
	</components:GroupBox>
</s:Application>

 

 

 

4 css

可以通过css为GroupBox指定样式的默认值。

@namespace components "jx.components.*";
components|GroupBox {
	skinClass: ClassReference("jx.skins.GroupBoxSkin");
	cornerRadius: 5;
	borderColor: #104778;
	borderWeight: 1;
	dropShadowVisible: false;
}

5 代码方式指定组件的默认CSS样式

		private static const classConstructed:Boolean = classConstruct();

		// 指定默认样式
		private static function classConstruct():Boolean {
			var styleManager:IStyleManager2 = FlexGlobals.topLevelApplication.styleManager;
			if (!styleManager.getStyleDeclaration("jx.components.GroupBox")) {
				var css:CSSStyleDeclaration = new CSSStyleDeclaration(null, styleManager);
				css.defaultFactory = function():void {
					this.skinClass = GroupBoxSkin;
					this.borderAlpha = 1;
					this.borderColor = 0;			// 黑
//					this.borderColor = 0xD3D3D3;	// 灰
//					this.borderColor = 0x104778;	// 蓝
					this.cornerRadius = 5;
//					this.dropShadowVisible = true;
//					this.borderWeight = 1;
				}
				styleManager.setStyleDeclaration("jx.components.GroupBox", css, true);
			}
			return true;
		}
 

 

 

完整的项目请下载附件GroupBoxExam.zip

  • 大小: 2.4 KB
  • 大小: 1.5 KB
  • 大小: 1.6 KB
分享到:
评论
7 楼 jinxinhero 2011-02-15  
smithfox 写道
如果不考虑透明的情况,将Label设置背景色为白色后,并且使其z在上面,是不是简单些

是简单
当时我们项目的背景不是白的

还有我觉得用遮罩也不太好,不过不太会写画线的方法,就将就了
6 楼 smithfox 2011-01-20  
如果不考虑透明的情况,将Label设置背景色为白色后,并且使其z在上面,是不是简单些
5 楼 wolfbrood 2010-10-28  
挺好,谢谢了
4 楼 sjpsega 2010-10-28  
很实用啊,顶了~
3 楼 critor 2010-10-13  
挺好啊,楼主挺用心啊,拿走了。
2 楼 anreddy 2010-10-01  
好文!下在在下要找的资料,谢过了!
1 楼 zwnJava 2010-09-28  
好,继续发

相关推荐

    flex 带矩形边框的GroupBox.

    在Flex中,GroupBox是一个容器组件,用于组织和分组其他组件,提供了一种布局和视觉分隔的方式。当我们谈论“带矩形边框的GroupBox”,我们指的是一个具有明确边界线的GroupBox,这种边框通常表现为实心线条,用于...

    Flex GroupBox控件含源码

    Flex 本身没有提供 GroupBOX控件,与GroupBOX功能比较类似的控件有:Canvas画布控件。它有一个边框,但是这个边框,默认的样式是运行时不显示的,可以将borderStyle="solid"这样设置,看起来就好GroupBOX的功能,...

    flex3可用的groupBox组件

    总的来说,groupBox在Flex3中是实现界面布局和组件分组的重要工具,尽管在Flex4中有所改变,但在Flex3项目中依然有着广泛的应用。了解groupBox的特性和使用方法,能帮助开发者更好地组织和设计用户界面,提高应用...

    Flex 自定义GroupBox

    4. **事件处理**:自定义组件可能会扩展基本的Flex组件,因此可以监听和处理标准的鼠标和键盘事件,如点击、焦点变化等。 5. **易用性**:为了便于使用,自定义GroupBox应该提供简洁明了的API,允许开发者轻松地...

    去除WPF中GroupBox边框的白边

    可以通过两种方式实现:全局应用(在应用程序的资源字典中定义),或者只对特定的GroupBox实例应用。 6. **测试与优化**: 在实际应用中,可能需要针对不同的主题和视觉效果进行测试,以确保去除白边的同时,不会...

    QT中groupBox边框设置无边框又不影响内部组件边框的方法 - nature_forest的博客 - CSDN博客1

    4. 如果你想一次性去除所有groupBox的边框,可以使用下面的样式表: ```cpp ui-&gt;groupBox-&gt;setStyleSheet("QGroupBox{border:none}"); ``` 这将影响groupBox内的所有子组件,但如果你只想影响特定的groupBox,...

    请求高手帮忙把程序的分组框背景改一下

    4. **发送消息**:通过向分组框发送`WM_SETREDRAW`消息来禁用和启用重绘,然后使用`SetBkColor`和`SetTextColor`函数来改变背景色和文字颜色。 5. **使用GDI+**:如果你的程序支持GDI+,可以利用其丰富的绘图功能来...

    MFC GroupBox自绘控件,可以方便改变边框的颜色

    通常,Windows中的GroupBox控件是一个矩形区域,用以将一组相关的控件分组,它有一个标题并有一个默认的灰色边框。在MFC中,这个控件被表示为`CEdit`类的子类。然而,为了实现自定义边框颜色和字体功能,我们需要...

    GroupBox对界面中的控件进行分组.rar

    - **CheckBox和RadioButton**:在选项设置界面,用GroupBox将一组互斥的选项(如单选按钮)或可多选的选项(如复选框)分组,让用户清楚了解哪些可以同时选择,哪些不能。 - **TextBox和Button**:在数据输入界面,...

    学习Winform分组类控件(Panel、groupBox、TabControl)

    分组类控件主要包括容器控件(Panel),分组框控件(groupBox)和选项卡控件(TabControl)等控件。 一、Panel控件 Panel控件是由System.Windows.Forms.Panel类提供的,主要作用就是将其他控件组合一起放在一个面板上,使...

    给groupbox加上滚动条

    `GroupBox`是Windows Forms中的一个容器控件,它允许我们将相关的控件分组到一个可命名的区域内,以便于用户理解和操作。然而,`GroupBox`本身并不支持内置的垂直或水平滚动条,因此,我们需要自己动手来实现。 要...

    c#自定义GroupBox控件

    `GroupBox`控件是Windows Forms中的一个标准组件,通常用于将相关的控件分组并提供一个标题,以增加界面的可读性和用户友好性。然而,有时候系统提供的默认`GroupBox`可能无法满足特定的界面设计需求,这时就需要...

    C#自定义控件案例--美化GroupBox

    GroupBox是Windows Forms中的一个基础控件,通常用于将一组相关的控件组织在一起,形成视觉上的分组。默认情况下,GroupBox有一个简单的边框和标题。然而,对于某些应用程序,可能需要更精致的外观,例如自定义颜色...

    C#自定义控件案例--美化GroupBox非常经典

    4. **鼠标事件处理**:为了使美化后的GroupBox具有更好的交互性,需要添加鼠标事件处理代码,如鼠标进入、离开和点击事件。这可以使控件在鼠标悬停时显示高亮状态,增强用户体验。 5. **动画效果**:进一步提升用户...

    groupbox 透明背景

    然而,标准的GroupBox控件默认情况下有一个填充的背景颜色,这可能不符合某些设计需求,比如创建一个透明背景的groupBox以实现更美观或自定义的界面效果。本文将详细介绍如何实现GroupBox的透明背景,并探讨相关的...

    MFC重绘GroupBox透明

    为了实现一个具有透明背景并带有圆角的GroupBox,我们需要自定义控件的绘制逻辑。下面将详细讲解如何实现这一功能。 首先,我们需要创建一个新的CMyGroupBox类,它是CGroupBox类的派生类。在`MyGroupBox.h`文件中,...

    WPF内容控件使用GroupBox组合框控件,Expander控件,TabControl标签控件

    GroupBox是一种用于将相关控件分组的容器,它通过提供一个标题来标识其内部的控件集合。创建GroupBox非常简单,只需要在XAML中定义一个`&lt;GroupBox&gt;`元素,并设置`Header`属性来指定标题。例如: ```xml &lt;GroupBox ...

    silverlight Groupbox

    在Silverlight应用开发中,`GroupBox`控件是一个非常重要的组成部分,它用于组织和展示相关的UI元素,通常表现为一个带有标题的可折叠/展开的框。这个控件可以帮助开发者更有效地管理和展示应用程序的界面内容。 `...

    C# 编写Winform 自定义控件GroupBox

    在Winform中,GroupBox是一个非常实用的控件,它允许我们创建可分组的控件区域,通常用于组织和分类相关的UI元素。本文将深入探讨如何在C#中自定义一个Winform的GroupBox控件,结合实际项目经验和系统软件实施过程中...

    C#自定义控件案例--美化GroupBox2019

    4. **代码实现**: 在C#代码中,我们需要创建一个新的类,比如MyGroupBox,继承自GroupBox,并实现上述的自定义逻辑。例如: ```csharp public class MyGroupBox : GroupBox { protected override void OnPaint...

Global site tag (gtag.js) - Google Analytics