Flex 画出一个带边框有标头的容器

本文介绍如何使用Flex创建带有边框及标题的自定义容器组件。通过实现TitleGroup组件及其皮肤TitleGroupSkin,演示了如何利用遮罩层mask来定义容器外观,并展示了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多时候我们需要一个带边框,有标题的容器,这个需要用自定义skin来做.

其实就是用遮罩层mask来做的。话不多说,直接来代码吧

Main.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:component="com.component.*">
	<s:layout>
		<s:HorizontalLayout horizontalAlign="center"/>
	</s:layout>
	<component:TitleGroup title="Title Group title name" width="400" height="600">
		<component:layout>
			<s:VerticalLayout horizontalAlign="center"/>
		</component:layout>
		<s:Label text="This is the content."/>
		<s:Label text="This is the content."/>
		<s:Label text="This is the content."/>
		<s:Label text="This is the content."/>
	</component:TitleGroup>
</s:Application>

 TitleGroup.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:SkinnableContainer xmlns:fx="http://ns.adobe.com/mxml/2009" 
					  xmlns:s="library://ns.adobe.com/flex/spark" 
					  xmlns:mx="library://ns.adobe.com/flex/mx"
					  skinClass="com.component.skin.TitleGroupSkin">
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import spark.components.CheckBox;
			import spark.components.Label;
			[SkinPart(required="true")]
			public var titleDisplay:Label;
			[SkinPart(required="true")]
			public var enabledCheckBox:CheckBox;//这个纯粹是让你们了解下稍微复杂点的标头的设计。比如加上一个checkbox
			
			private var _title:String;
			private var customTitleChanged:Boolean = false;

			public function set title(value:String):void
			{
				this._title = value;
				this.customTitleChanged = true;
				invalidateProperties();
			}
			public function get title():String
			{
				return this._title;
			}
			private var _allowGroupStatusControl:Boolean;
			private var allowGroupStatusControlChanged:Boolean = false;
			public function set allowGroupStatusControl(value:Boolean):void
			{
				this._allowGroupStatusControl = value;
				allowGroupStatusControlChanged = true;
				invalidateProperties();
			}
			
			private var _titleGroupSelected:Boolean = false;
			private var titleGroupSelectedChanged:Boolean = false;
			public function set titleGroupSelected(value:Boolean):void
			{
				this._titleGroupSelected = value;
				titleGroupSelectedChanged = true;
				invalidateProperties();
			}
			
			override protected function commitProperties():void
			{
				super.commitProperties();
				if(titleDisplay != null && this.customTitleChanged)
				{
					titleDisplay.text = this._title;
					this.customTitleChanged = false;				
				}
				if(enabledCheckBox != null && allowGroupStatusControlChanged)
				{
					enabledCheckBox.visible = enabledCheckBox.includeInLayout = this._allowGroupStatusControl;
					titleDisplay.visible = titleDisplay.includeInLayout = !this._allowGroupStatusControl;
					allowGroupStatusControlChanged = false;
					contentGroup.enabled = false;
				} 
				if(titleGroupSelectedChanged && enabledCheckBox && contentGroup)
				{
					contentGroup.enabled = enabledCheckBox.selected = this._titleGroupSelected;
					titleGroupSelectedChanged = false;
				}
			} 
			
			override protected function partAdded(partName:String, instance:Object):void
			{
				super.partAdded(partName,instance);
				 if(instance == enabledCheckBox)
				{
					 enabledCheckBox.label = this.title;
					enabledCheckBox.addEventListener(flash.events.Event.CHANGE,callback);
				}
				function callback(evt:Event):void
				{
					if(enabledCheckBox.selected)
					{
						contentGroup.enabled = true;
					}
					else
					{
						contentGroup.enabled = false;
					}
					dispatchEvent(new Event("titleGroupStatusChanged"));
				} 
			}
			
			public function get titleGroupEnabled():Boolean
			{
				return contentGroup.enabled;
			}
		]]>
	</fx:Script>
	<fx:Metadata>
		[Event(type="flash.events.Event",name="titleGroupStatusChanged")]
	</fx:Metadata>
</s:SkinnableContainer>

 TitleGroupSkin.mxml

<?xml version="1.0" encoding="utf-8"?>

<!--

    ADOBE SYSTEMS INCORPORATED
    Copyright 2008 Adobe Systems Incorporated
    All Rights Reserved.

    NOTICE: Adobe permits you to use, modify, and distribute this file
    in accordance with the terms of the license agreement accompanying it.

-->

<!--- The default skin class for a Spark SkinnableContainer container.  

     @see spark.components.SkinnableContainer
        
      @langversion 3.0
      @playerversion Flash 10
      @playerversion AIR 1.5
      @productversion Flex 4
-->
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5">

    <fx:Metadata>
    <![CDATA[ 
        /** 
         * @copy spark.skins.spark.ApplicationSkin#hostComponent
         */
        [HostComponent("spark.components.SkinnableContainer")]
    ]]>
    </fx:Metadata> 
    
    <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="{titleGroup.width+4}" top="30" bottom="0">
			<s:fill>
				<s:SolidColor color="#00ff00" alpha="1"/>
			</s:fill>
		</s:Rect>
		<s:Rect left="{titleGroup.width + 11}" width="100%" top="0" bottom="0">
			<s:fill>
				<s:SolidColor color="#0000ff" alpha="1"/>
			</s:fill>
		</s:Rect>
	</s:Group>
    <!--- Defines the appearance of the SkinnableContainer class's background. -->
	<s:Rect left="0" top="5" right="0" width="100%" height="100%" 
			mask="{borderGroupMask}"
			topLeftRadiusX="6"  topRightRadiusX="6" bottomLeftRadiusX="6" bottomRightRadiusX="6">
		<s:stroke>
			<s:SolidColorStroke color="#D8D8D8" scaleMode="none"/>
		</s:stroke>
	</s:Rect>
    <!--- @copy spark.components.SkinnableContainer#contentGroup -->
	
	<s:BorderContainer id="titleGroup" left="10" top="0" borderAlpha="0" backgroundAlpha="0"
					   minWidth="20"
					   height="{titleDisplay.height}">
		<s:layout>
			<s:HorizontalLayout verticalAlign="middle" gap="2" paddingLeft="6"  paddingRight="6"/>
		</s:layout>
		<s:CheckBox id="enabledCheckBox" includeInLayout="false" visible="false"/>	
		<s:Label id="titleDisplay" fontSize="14"/>	
	</s:BorderContainer>
	
	
    <s:Group id="contentGroup" left="0" right="0" top="15" bottom="0" minWidth="0" minHeight="0">
        <s:layout>
            <s:VerticalLayout paddingTop="6" paddingLeft="6" paddingRight="6" paddingBottom="6"/>
        </s:layout>
    </s:Group>

</s:Skin>

 效果图:

<think>嗯,用户现在的问题是关于如何在JMeter中提取上一个响应中的参数数据。我之前已经回答过一些关于JMeter的内容,比如JSON提取器的使用,还有响应断言的相关信息。不过这次用户关注的是响应部的参数提取,这和之前的JSON提取可能不太一样,需要不同的方法。 首先,我需要回忆一下JMeter中处理响应的方法。用户之前的问题中提到过使用JSON提取器,但响应通常不是JSON格式,而是HTTP信息。所以可能需要用到正则表达式提取器或者其他的后置处理器。根据引用中的内容,比如引用3提到可以通过SampleResult获取响应数据,包括请求和响应的信息。可能用户需要使用BeanShell或者JSR223后置处理器来提取这些信息。不过对于普通用户来说,可能更倾向于使用内置的提取器,比如正则表达式提取器。另外,引用4提到响应断言中的Ignore Status选项,这可能和检查响应状态有关,但不确定是否和提取部参数直接相关。需要确认用户是否需要从成功的响应中提取,或者需要考虑不同的状态码。 用户的需求是提取上一个请求的响应中的参数,比如可能想要获取Location中的重定向URL,或者某个自定义的Header字段。这时候,正则表达式提取器可能是最直接的方法,因为可以匹配Header中的特定模式。 步骤可能包括:在请求后添加正则表达式提取器,配置提取的字段为响应,编写匹配的正则表达式。例如,要提取Location,可以使用正则表达式Location: (.*?)\n,然后引用变量到后续请求中。另外,引用3中的SampleResult.getResponseHeaders()可能可以用来获取所有响应,但需要写脚本,比如在BeanShell断言中使用。不过对于大多数用户来说,使用正则表达式提取器更简单,不需要写代码。 还需要注意,JMeter的响应数据保存在哪个变量里。可能默认情况下,响应可以通过正则表达式提取器,选择“响应”作为检查的字段。或者,是否有现成的变量存储了响应信息,比如${JMeter变量}。另外,用户可能需要将提取的值传递给下一个请求,比如在HTTP请求管理器中使用变量,或者直接在URL参数中引用。需要确保提取的变量名称正确,并且在后续步骤中正确引用。总结下来,步骤应该是:添加正则表达式提取器,选择检查响应,编写合适的正则表达式,然后在后续请求中使用${变量名}来引用提取的值。同时,可能需要测试正则表达式是否正确匹配,可以使用调试取样器来查看提取的变量值是否正确。 此外,是否需要考虑多个匹配的情况,比如多个相同的字段,这时候正则表达式提取器的匹配数字如何处理。比如,如果中有多个相同的字段,可能需要指定匹配1表示第一个,或者-1表示所有,根据用户的具体需求调整。 最后,需要验证方法是否有效,建议用户添加调试器或查看结果树来确认变量是否正确提取。可能还需要提醒用户注意正则表达式中的转义字符,比如冒号、空格等是否需要转义,或者使用更灵活的正则表达式来匹配不同的情况。</think>在JMeter中提取上一个请求响应中的参数数据,可通过以下步骤实现: --- ### 一、提取响应参数的方法 #### 1. **正则表达式提取器** - **适用场景**:提取中符合特定格式的参数(如`Location`、`Set-Cookie`等)。 - **操作步骤**: 1. 右键点击目HTTP请求 → **Add** → **Post Processors** → **Regular Expression Extractor**[^3]。 2. 配置参数: - **Apply to**:选择`Main sample only`(默认)。 - **Field to check**:选择`Response Headers`(关键步骤)。 - **正则表达式**:根据格式编写,例如提取`Location`: ```regex Location: (.*?)\r\n ``` - **Template**:`$1$`(表示提取第一个匹配组)。 - **Match No.**:`1`(提取第一个匹配值)。 3. 后续请求中通过`${变量名}`引用提取的值。 #### 2. **BeanShell/JSR223后置处理器** - **适用场景**:需动态处理或提取复杂逻辑时。 - **示例代码**(获取全部响应): ```java String headers = prev.getResponseHeaders(); // 获取所有响应 vars.put("headers", headers); // 存入变量headers ``` 通过`${headers}`可访问所有内容[^3]。 --- ### 二、使用提取的参数 #### 1. **传递到后续请求** - 在HTTP请求的**Header Manager**中添加自定义,例如: ```plaintext Authorization: ${extracted_header} ``` - 或在URL参数中直接引用: ```plaintext http://api.example.com?token=${extracted_header} ``` #### 2. **调试与验证** - 添加**Debug Sampler**查看提取的变量值。 - 使用**View Results Tree**检查响应是否匹配正则表达式[^2]。 --- ### 三、注意事项 1. **格式一致性**:确保正则表达式匹配的实际格式(如大小写、空格)。 2. **多值处理**:若有多个值(如`Set-Cookie`),需调整正则表达式的`Match No.`或使用循环控制器。 3. **性能影响**:正则表达式复杂度可能影响测试效率,建议优先使用简单匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值