AsWing 应用之JTable的例子

2013-07-26 ActionScript3 AsWing

package
{
	import flash.display.Sprite;
	import org.aswing.ASColor;
	import org.aswing.JScrollPane;
	import org.aswing.JTable;
	import org.aswing.VectorListModel;
	import org.aswing.event.SelectionEvent;
	import org.aswing.table.PropertyTableModel;
	import org.aswing.table.sorter.TableSorter;
	/**
	 * 一个AsWing JTable的例子
	 [email protected] waylau.com
	 [email protected] 2013-7-26
	 */
	public class JTableExample extends Sprite
	{
		private var data:Array = [];  //表格数据源
		private var columns:Array = [];  //列项
		private var table:JTable;
		/**
		 * PropertyTableModel是JTable的表格模型之一,常常用于把一个对象列表中的对象数据,以对象为行,
		 * 以对象属性为列来显示,它提供默认方式把属性值以直接字符串化显示,也提供转换器(PropertyTranslator 或Function)
		 * 把值转换成期望的字符串格式来显示
		 */
		private var tableModel:PropertyTableModel; 
		/**
		* VectorListModel是AsWing自带的ListModel 实现,它的行为类似一个Vector, 
		* 可以随意在任何位置插入/删除数据,并且在数据改变时,会自动触发对应的事件,使得JList 自动更新界面显示。
		*/
		private var modeList:VectorListModel; 
		/**
		 * TableSorter表格排序器。它是TableModel 接口的一个实现,通过包装一个现有的 TableModel 来实现排序。
		 * 实现原理为:以选择排序方式为基准,变换原始TableModel 类的行的值,以达到变换行顺序的目的。
		 * 排序所采用的值比较函数,可以通过给指定列设定列类型,然后给指定列类型设定比较函数来达到。
		 * 默认情况下,所有列的类型都是Object 类型,TableSorter 自带String 和Number 类型的比较函数,
		 * 对于没有指定比较函数的列,默认将采用String 类型的比较函数
		 */
		private var sorter:TableSorter;

		public function JTableExample()
		{
			super();
			init();
		}

		private function init():void
		{		
			this.stage.frameRate = 25;
			data = [{name:"iiley", sex:1, age:26, score:99},
				{name:"Comeny", sex:0, age:24, score:100},
				{name:"Tom", sex:1, age:30, score:98},
				{name:"Lita", sex:0, age:16, score:36}]
			;
			modeList = new VectorListModel(data);
			columns = ["Name", "Sex", "age", "Score"] ;
			tableModel = new PropertyTableModel(modeList,columns,["name","sex","age","score"],[null,sexTranslator,null,null,]);
			sorter = new TableSorter(tableModel);

			this.table = new JTable(sorter);
			this.table.setRowHeight(22);
			//水平间隔线
			table.setShowHorizontalLines(false);
			//竖直间隔线
			table.setShowVerticalLines(false);
			//设置字体颜色,前景色
			 table.setForeground(new ASColor(0xffffff));
			//设置选中行的时候的字体颜色
			table.setSelectionForeground(new ASColor(0x123456));
			//拉伸的模式,随意拉伸
			this.table.setAutoResizeMode ( JTable.AUTO_RESIZE_OFF );
			//只能选择一行
	 		this.table.setSelectionMode ( JTable.SINGLE_SELECTION );
			//设置表格底色
			this.table.setBackground(new ASColor(0x000000));
			//设置监听row选中
			this.table.addEventListener(SelectionEvent.ROW_SELECTION_CHANGED,__rowSelectHandler);

			var panel:JScrollPane = new JScrollPane();
			panel.setSizeWH(200, 100);
			panel.append(this.table);
			this.addChild(panel);
		 	panel.validate();
		}
		/**
		 * row选择执行事件
		 */
		private function __rowSelectHandler(e:SelectionEvent):void
		{
			var rowCount : int = this.table.getSelectedRow();

			if(rowCount>0)
			{
				var row:Object = modeList.getElementAt(sorter.modelIndex(rowCount));
			}
			if(row!=null)
			{
				trace("Human"+" Name:"+row.name+",Sex:"+row.sex+",Age:"+row.age+",Score:"+row.score);
			}
		}
		/**
		 * 性别转换器
		 */
		private function sexTranslator(info:*, key:String):String
		{
			if(info[key]=="1")
			{
				return "男";
			}
			else
			{
				return "女";
			}
		}
	}
}  参考:

http://www.aswing.org/?tag=jtable

http://wiki.9ria.com/index.php/Aswing

http://www.ebibi.com/i/study/2010/0913/1262.html


纯AS3项目导入fl包的方法以及fl.controls.DataGrid的详细应用

2013-07-05 ActionScript3

在Flash CS4中打开“D:\Program Files\Adobe\Adobe Flash CS4\Common\Configuration\Components\”目录下的“User Interface.fla”文件 进入文件—发布设置—Flash—勾选“导出SWC” 点“导出影片”,输入文件名,确定之后就出现了swc文件 进入Flash builder,在ActionScript项目属性中引用刚刚导出的swc文件 这时就可以在源代码中 import fl.controls.* 并使用Flash CS4中的UI组件了

另外fl.controls.DataGrid的详细应用

参见:http://edutechwiki.unige.ch/en/Flash_datagrid_component_tutorial

http://crazyrabbit.blogbus.com/logs/38711416.html


AS3使用thrift的与JHava servlet服务器端通信

2013-06-22 ActionScript3 Java

##一、基本概念

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。

Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

官网地址:http://thrift.apache.org

###1.数据类型

基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 Java 的 short i32:32 位有符号整数,对应 Java 的 int i64:64 位有符号整数,对应 Java 的 long double:64 位浮点数,对应 Java 的 double string:utf-8编码的字符串,对应 Java 的 String 结构体类型: struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean 容器类型: list:对应 Java 的 ArrayList set:对应 Java 的 HashSet map:对应 Java 的 HashMap 异常类型: exception:对应 Java 的 Exception 服务类型: service:对应服务的类

###2.服务端编码基本步骤:

实现服务处理接口impl 创建TProcessor 创建TServerTransport 创建TProtocol 创建TServer 启动Server 3.客户端编码基本步骤:

创建Transport 创建TProtocol 基于TTransport和TProtocol创建 Client 调用Client的相应方法 4.数据传输协议

TBinaryProtocol : 二进制格式. TCompactProtocol : 压缩格式 TJSONProtocol : JSON格式 TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析 tips:客户端和服务端的协议要一致

##二、as3与java通信示例

test.thrift namespace java com.xzw.thrift namespace as3 com.xzw.thrift struct User{ 1:i32 userId, 2:string loginName, 3:string password, 4:string name }

exception UserNotFound{ 
    1:string msg  //as3中由于message是关键字,所以避免使用message关键字。 
} 

service UserService{ 
    User getUser(1:string loginName) throws (1:UserNotFound unf), 
    list<User> getUsers() 
}  通过命令生成java代码

thrift –gen java test.thrift

以上命令会生成gen-java的目录拷贝里面的代码到你的项目中。如图com.xzw.thrift就是

工具生成java类。

其中我们需要去实现UserService类中的IFace接口。代码如下: /* * To change this template, choose Tools Templates * and open the template in the editor. */ package com.xzw.service;
import com.xzw.thrift.User; 
import com.xzw.thrift.UserNotFound; 
import com.xzw.thrift.UserService; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Logger; 
import org.apache.thrift.TException; 

/** 
 * 
 * @author xzw 
 */ 
public class UserServiceHandler implements UserService.Iface{ 

    public User getUser(String loginName) throws UserNotFound, TException { 
        if(!"xuzhiwei".equals(loginName)){ 
            UserNotFound e = new UserNotFound("用户无法找到!"); 
            throw e; 
        }  
        User user = new User(); 
        user.setUserId(100); 
        user.setLoginName("xuzhiwei"); 
        user.setPassword("123456"); 
        user.setName("user1"); 
        Logger.getLogger("user=>"+user.toString()); 
        return user;  
    } 

    public List<User> getUsers() throws TException { 
       List<User> list = new ArrayList<User>();   
        User user = new User();   
        user.setUserId(100);   
       user.setLoginName("xuzhiwei"); 
        user.setPassword("123456"); 
        user.setName("user1");   
        list.add(user);   
        User user2 = new User();   
        user2.setUserId(200);   
        user2.setLoginName("login2");   
        user2.setPassword("pwd2");   
        user2.setName("user2");   
        list.add(user2);   

         Logger.getLogger("user list=>"+list.toString()); 
        return list;   
    } 

}
编写servlet,servlet需要继承thrift提供的类包TServlet即可,不需要去重写doGet,doPost方法。 /* * To change this template, choose Tools Templates * and open the template in the editor. */ package com.xzw.service;
import com.xzw.thrift.UserService; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.server.TServlet; 

/** 
 * 
 * @author xzw 
 */ 
public class UserServlet extends TServlet{   

     public UserServlet(){   
         super(new UserService.Processor(new UserServiceHandler()),new TBinaryProtocol.Factory(true, true)); 
     }        
}

以上就完成服务器端的编写了。

可以使用junit测试一下: /* * To change this template, choose Tools Templates * and open the template in the editor. */
import com.xzw.thrift.User; 
import com.xzw.thrift.UserService; 
import java.util.List; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.apache.thrift.TException; 
import org.apache.thrift.protocol.TBinaryProtocol; 
import org.apache.thrift.protocol.TProtocol; 
import org.apache.thrift.transport.THttpClient; 
import org.junit.*; 

/** 
 * 
 * @author xzw 
 */ 
public class TestServlet { 

     @Test 
    public void test(){ 
        String serveltUrl = "http://localhost:8080/test_thrift/userServlet"; 
        try { 
            THttpClient thc = new THttpClient(serveltUrl); 
            TProtocol lopFactory = new TBinaryProtocol(thc); 
           UserService.Client client = new UserService.Client(lopFactory); 

           List users = client.getUsers(); 
           System.out.println("-->>"+users.toString()); 
        } catch (TException ex) { 
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); 
        } 
   } 

    @Test 
    public void test2(){ 
        String serveltUrl = "http://localhost:8080/test_thrift/userServlet"; 
        try { 
            THttpClient thc = new THttpClient(serveltUrl); 
            TProtocol lopFactory = new TBinaryProtocol(thc); 
           UserService.Client client = new UserService.Client(lopFactory); 

           User user = client.getUser("xuzhiwei"); 
           System.out.println("-->"+user.toString()); 
        } catch (TException ex) { 
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex); 
        } 
   } 
}

接下来生成as3代码

thrift –gen as3 test.thrift www.it165.net

以上代码会生成gen-as3的目录,拷贝目录下的代码到你的工程中。

编写as3客户端类:

package { 
import com.xzw.thrift.User; 
import com.xzw.thrift.UserNotFound; 
import com.xzw.thrift.UserService; 
import com.xzw.thrift.UserServiceImpl;

    import flash.display.Sprite; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 

    import org.apache.thrift.protocol.TBinaryProtocol; 
    import org.apache.thrift.protocol.TProtocol; 
    import org.apache.thrift.transport.THttpClient; 

    public class testthrift extends Sprite 
    {  
        private const SERVER_URL:String = "http://localhost:8080/test_thrift/userServlet";  
        private var textField:TextField; 

        public function testthrift() 
        {  
            init(); 
            connServer();  
        } 

        private function init():void 
        { 
            textField = new TextField();  
            textField.width = 300; 
            textField.height = 500;  
            textField.autoSize = "left"; 
            addChild(textField); 
        } 

        private function connServer():void 
        {   //实例化URLRequest 
            var urlRequest:URLRequest = new URLRequest(SERVER_URL); 
            //实例化THttpClient 
            var thc:THttpClient = new THttpClient(urlRequest); 
            var protocol:TProtocol = new TBinaryProtocol(thc); 

            var usImpl:UserService = new UserServiceImpl(protocol); 
            usImpl.getUser("xuzhiwei",onError,onUserSuccess); 
            //usImpl.getUsers(onError,onSuccess); 
        } 

        private function onError(e:UserNotFound):void{ 
            trace(e); 
        } 

        private function onUserSuccess(user:User):void{ 
            trace("success:"); 
            trace(user); 
            textField.text = user.toString(); 
        } 

        private function onSuccess(user:Array):void{ 

            trace(user); 
            textField.text = user.toString(); 
        } 

    } 
}

写完了,测试结果

参考:http://xuzhiwei.blog.51cto.com/978424/1184540

http://jnb.ociweb.com/jnb/jnbJun2009.html


由“JasperReports 4.1.2升级到5.1.2对flex项目的解析”到AS3 带命名空间的XML的操作

2013-06-21 JasperReports

项目中,对JasperReports-4.1.2核心包进行了升级,发现,前端flex无法对JasperReports的格式进行解析了~

iReport 4.1 设计的模版可以解析,而iReport 4.6 设计的模版就不行了~

断点后,对比了从后台传过来的JasperReports 的xml数据,发现存在差异

4.1.2包生成的xml数据jasperPrint标签为:

<jasperPrint name="report13" pageWidth="842" pageHeight="842" topMargin="0" leftMargin="0" bottomMargin="0" rightMargin="0" locale="zh_CN" timezone="Asia/Shanghai"> 5.1.2包生成的xml数据jasperPrint标签为:

<jasperPrint xmlns="http://jasperreports.sourceforge.net/jasperreports/print"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/print
http://jasperreports.sourceforge.net/xsd/jasperprint.xsd" name="report13"
pageWidth="842" pageHeight="842" topMargin="0" leftMargin="0" bottomMargin="0"
rightMargin="0" locale="zh_CN" timezone="Asia/Shanghai">

后期版本的JasperReports核心包多生成了命名空间

而之前官方提供JasperReports 的flex解析包net.sf.jasperreports.flex (来自JasperReports的项目示例jasperreports-flash-4.0.0-project.zip)任然停留在2010年的版本未更新(估计JasperReports放弃了对flash的支持),导致无法对新版本的xml数据进行解析

AS3对于带命名空间的XML的解析操作上有很大的差异,例如以下来自JasperReports的ReportFactory.as

var props:XMLList = xml.property;
		for each (var prop:XML in props)
		{
			if (prop.@name == "net.sf.jasperreports.export.xml.start.page.index")
			{
				report.startPageIndex = int(prop.@value);
			}
			if (prop.@name == "net.sf.jasperreports.export.xml.end.page.index")
			{
				report.endPageIndex = int(prop.@value);
			}
			if (prop.@name == "net.sf.jasperreports.export.xml.page.count")
			{
				report.pageCount = int(prop.@value);
			}
		}

由于新版本多了命名空间,所以 直接xml.property 是无法获取到property的。要带上命名空间

var ns:Namespace = new Namespace("http://jasperreports.sourceforge.net/jasperreports/print");
trace(xml.ns::property);    //输出带名字空间的XML

由于 涉及到多个 命名空间,这种方式在该项目中不合适,且要修改后续的其他操作。

最简单的方式,就是 干掉命名空间,这样后续操作不变。

这个就涉及到XML的操作了。查XML api发现了removeNamespace(ns:Namespace):XML方法,以为轻松搞定,实验后 ,发现 不行。默认的命名空间(如 xmlns=”http://jasperreports.sourceforge.net/jasperreports/print”)无法删除。

用xml.children()方法取他孩子,发现,每个孩子也带上了命名空间。

最后用上了正则表达式。限定类型的命名表达式可以删除了。而且用了两次。汗。。

       var str:String = oldxml.toString();

       var str2:String = str.replace(/xmlns(.*?)="(.*?)"/gm, "").replace(/xsi(.*?)="(.*?)"/gm, "");

        xml = new XML(str2);

FlashBuilder4.7更新AIR SDK方法

2013-06-15 AIR

默认情况下,Flash Builder 4.7安装了AIR SDK 3.4。如果你想使用别的SDK版本,你覆盖掉它就行了。下面就来介绍一下如何覆盖。 下载合适的AIR SDK文件:http://labs.adobe.com/downloads/asc2.html ,然后保存到AIR SDK的根目录(是SDK的根目录)。 注意了:这个AIR SDK包含了:Adobe AIR SDK、ActionScript编译器以及其它必需的组件和文件。 在进入以下步骤前,先退出Flash Builder: 在Flash Builder里更新AIR SDK的步骤: 1.(可选)备份旧的AIR SDK,把整个SDK目录都复制一份吧。AIR SDK的目录是在(因人而异,但大概一样): Windows 7: C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722 Mac OS: /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722

  1. 在备份完后,删除SDK文件夹里的所有文件(译者注:这个SDK文件夹的名字为“AIRSDK”。只删除SDK文件夹里的文件,不要把SDK文件夹也删除了)。
  2. 下载的SDK通常是一个压缩包(zip/tbz2)。解压这个包,提取所有文件,把文件复制到那个名为“AIRSDK”的文件夹。

参考Adobe 原文:http://helpx.adobe.com/flash-builder/kb/overlay-air-sdk-flash-builder.html


一个用于检测FPS和内存占用的小例子

2013-06-14 ActionScript3

用于实时检测FPS(实际上可以算是检测CPU)和内存占用情况。

使用方法,在application的Document Class(或者Application Class)上构建一个检测器实例(MonitorKit)并addChild即可,所含参数比较简单,不再一一赘述:

 var monitor:MonitorKit = new MonitorKit(MonitorKit.MKMODE_T);
addChild(monitor);
package 
{
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.events.Event;
  import flash.system.System;
  import flash.text.TextField;
  import flash.text.TextFieldAutoSize;
  import flash.text.TextFormat;
  import flash.utils.getTimer;

  public class MonitorKit extends Sprite{
    public static const MKMODE_T:String = "MKMODE_T";
    public static const MKMODE_B:String = "MKMODE_B";
    public static const MKMODE_L:String = "MKMODE_L";
    public static const MKMODE_R:String = "MKMODE_R";
    public static const MKMODE_TL:String = "MKMODE_TL";
    public static const MKMODE_TR:String = "MKMODE_TR";
    public static const MKMODE_BL:String = "MKMODE_BL";
    public static const MKMODE_BR:String = "MKMODE_BR";

    private static var stageInstance:Stage;

    private var lastTime:uint = getTimer();
    private var frames:Number = 0;
    private var monitorKitTextField:TextField;
    private var mode:String;
    private var textColor:uint;
    private var backgroundColor:uint;
    private var transparent:Boolean;
    public static var delay:Number = 0;
    public function MonitorKit(_mode:String = MKMODE_T,
        _transparent:Boolean = true,
        _textColor:uint=0xffffff,
        _backgroundColor:uint=0x000000) {
      mode = _mode;
      transparent = _transparent;
      textColor = _textColor;
      backgroundColor = _backgroundColor;
      // Initialize it when rendered on the stage.
      addEventListener(Event.ADDED_TO_STAGE, initMonitorHandler);
    }

    private function initMonitorHandler(event:Event):void {
      // Unregister the event handler
      removeEventListener(Event.ADDED_TO_STAGE, initMonitorHandler);
      stageInstance = this.stage;
      monitorKitTextField = new TextField();
      monitorKitTextField.selectable = false;
      monitorKitTextField.background = transparent;
      monitorKitTextField.textColor = textColor;
      monitorKitTextField.backgroundColor = backgroundColor;
      monitorKitTextField.autoSize = TextFieldAutoSize.LEFT;
      var format:TextFormat = new TextFormat();
      format.font = "Courier New";
      format.size = 15;
      monitorKitTextField.setTextFormat(format);
      monitorKitTextField.defaultTextFormat = format;
      monitorKitTextField.text = "[ Loading... ]";
      addChild(monitorKitTextField);
      stageInstance.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
    }

    public function enterFrameHandler(evt:Event):void {
      frames++;
      var currentTime:uint = getTimer();
      var deltaTime:uint = currentTime - lastTime;
      var fps:Number = frames / deltaTime * 1000;
      monitorKitTextField.text = "FPS: " + fps.toFixed(1);
      monitorKitTextField.appendText("\nMem: " + Number(System.totalMemory/1024/1024).toFixed(3)+"(M)");
      frames = 0;
      lastTime = currentTime;
      // Replace the monitor object
      switch (mode) {
        case MKMODE_T:
          monitorKitTextField.x = stageInstance.stageWidth / 2 - monitorKitTextField.width / 2;
          monitorKitTextField.y = 0;
          break;
        case MKMODE_B:
          monitorKitTextField.x = stageInstance.stageWidth / 2 - monitorKitTextField.width / 2;
          monitorKitTextField.y = stageInstance.stageHeight - monitorKitTextField.height;
          break;
        case MKMODE_L:
          monitorKitTextField.x = 0;
          monitorKitTextField.y = stageInstance.stageHeight / 2 - monitorKitTextField.height / 2;
          break;
        case MKMODE_R:
          monitorKitTextField.x = stageInstance.stageWidth - monitorKitTextField.width;
          monitorKitTextField.y = stageInstance.stageHeight / 2 - monitorKitTextField.height / 2;
          break;
        case MKMODE_TL:
          monitorKitTextField.x = 0;
          monitorKitTextField.y = 0;
          break;
        case MKMODE_TR:
          monitorKitTextField.x = stageInstance.stageWidth - monitorKitTextField.width;
          monitorKitTextField.y = 0;
          break;
        case MKMODE_BL:
          monitorKitTextField.x = 0;
          monitorKitTextField.y = stageInstance.stageHeight - monitorKitTextField.height;
          break;
        case MKMODE_BR:
          monitorKitTextField.x = stageInstance.stageWidth - monitorKitTextField.width;
          monitorKitTextField.y = stageInstance.stageHeight - monitorKitTextField.height;
          break;
        default:
        break;
      }
    }
  }
} 

AIR SDK 0 AIR SDK location does not exist 解决

2013-06-05 AIR

导入AS3项目时提示 “AIR SDK 0.0: AIR SDK location "D:\Program Files\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\devsdks\AIRSDK\Win" does not exist.”

是AS3项目找不见AIR SDK. 打开项目配置 ActionScript Build Path ,路径出错。

他默认是去Flash Builder 4.7安装目录下的..\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\devsdks\AIRSDK\Win去找。

但是 我的Builder根本没有这个Win文件

##解决步骤:

###1. 先去官网下载下载和更新SDK

可参考此文http://www.waylau.com/update-air-sdk-flash-builder

###2. 如果上述方法无效

..\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flexbuilder.flex_4.7.0.349722\ 目录下创建 devsdks文件夹,再在devsdks创建AIRSDK,再在AIRSDK下创建Win 即创建它搜索的那个路径

###3.将下载的AIRSDK中的文件复制进新建的Win文件夹下。

###4.回到配置界面ActionScript Build Path移除之前的AIRSDK,再点击“ADD AIR SDK”


iReport 5.1.0下载、安装、创建数据源、制作报表

2013-05-22 iReport

一、ireport下载最新版

本例为5.1.0 http://sourceforge.net/projects/ireport/files/?source=navbar

二、安装,直接下一步

三、ireport连接数据库,创建数据源

默认数据源是空的 ,需要自己创建数据源,当然也可以选择他的测试数据库

 

1.点击图中按钮,弹出窗,点击 new

 

2.这里选择的是 Database JDBC Connection

 

3.iReport默认的数据库驱动为黑色字体部分,红色字体需另外导入包

 

4.工具à选项

 

5.在Classpath添加数据库驱动包

这里我们连接的是sql2000数据库,填加一个jtds-1.2.2.jar

 

6.再回到之前的那个数据源设置界面

net.sourceforge.jtds.jdbc.Driver 变成了黑色。选中它

 

7.JDBC URL中填入数据库的地址和库名,并填入正确的用户名和密码。

本例选用了一个已经存在的数据库。

点击Test,提示test succesful则说明连接成功。

输入Name, 本例为”EEMS”。

点击Save保存设置。

 

四、新增报表模版

1.文件 –>new file,选择blank A4 ,点击 launch report wizard

 

2.填入报表名称,选择输出的目录

 

3.直接填入查询sql语句,或者选择load query导入已有的sql文件

本例选用design query 采用可视化界面来设计sql语句

 

双击选中的数据库表,选择要查询的字段

 

点击OK,自动生成了sql语句

 

4.选择要参与的字段

 

这里向右移入所有字段

 

5.选择要分组的字段

这里选择loginName字段

 

6.出现下面提示,说明模版创建成功!

 

五、设计报表

 

报表的结构包括如下部分:Title、Page Header、Column Header、Detail、Column Footer、Page Footer、Summary.下面一一的介绍各个部分。

Title:为报表的标题部分,如果报表有多页,则只显示在第一页。

Page Header :为报表每页的一个头部名称,如果报表有多页,则每页都会显示。

Column Header:可以理解成表头,如果报表有多页,则每页都会显示。

Detail:详细记录,迭代列出所有的查询结果,有多少数据都会显示出来(分页)。

Column Footer:相当于表尾,如果报表有多页,则每页都会显示。

Page Footer:与Page Header对应,每页都会显示。

Summary:报表的一些统计信息。比如共有多少页,当前是第几页等信息。

设计报表的要求是:列出所有用户的信息,(查询语句决定。)

1.从组件面板中,拖出一个 Static Text 组件来,放置在报表的Title部分,输入”用户列表”。

 

2.在Page Header 也同样拖入一个 Static Text 组件,输入”管理员”

3.展开左侧的 Report Inspector,展开Fields子项,

 

将图所示的字段,拖入Detail项中,此时会发现,Column Header项中自动填充了Static Text的表头,如图所示:

 

在右侧”属性”,也可以对表头进行编辑,重命名等操作。可以调整各组件的位置、大小等信息。

 

4.选择 预览方式,这里选HLML

 

5.点击预览,选择Preview

 

6.显示数据库数据啦,成功啦。~