2009年10月 的存档

国产Flex UI组件库——AsWing

AsWing是一套UI组件框架,纯ActionScript开发的组件框架(有ActionScript2和ActionScript3版本),也包含一些常用的工具类,目的是让Flash/Flex开发人员方便的开发出想要的应用程序界面。另外AsWing还提供SkinBuilder和GuiBuilder工具用于制作Skin和可视化编辑生成界面。目前AsWing团队专注于ActionScript3版本的开发和维护。 AsWing以 BSD协议发布,不管你是商业还是非商业,都可以自由免费使用.
官方网站:http://cn.aswing.org/
相关下载地址:http://code.google.com/p/aswing/downloads/list

试用了一下,全是as,不包含mxml,感觉回到了swing的年代。生成的flash界面风格也类似於swing的默认风格,一时也就没继续深入了。先打个记号,以后有时间再回头看看!

写点体会

1.那天晚上和小V去吃烧烤喝酒,聊起了高三到大学,感叹说:高三的极度压抑催生了我们大学时的报复性的玩乐。是对还是错,都已走过……没经历过高考的人又怎能体会的到呢?

2.看巨人集团上市后,研发团队富裕了,变得不思进取——所以我们现在都还穷又有什么关系呢?我们该感谢还有很多很多值得我们为之奋斗,而不必每天谈论买什么豪华车住哪个高级别墅。

3.多年前就有说是:中国人最擅长内斗——对创业已经有一些想法了,虽然仍在原始积累的阶段,同时慢慢物色着将来的创业团队。我希望将来的创业团队都能够秉承这样的文化:来自团队的指令,我们坚决的执行;我们正在做的工作,将是影响我们毕生的事业;

4.当你是领导者,就要努力让自己喜欢上与能力强者共处,尤其是他作为你的下属的时候!

5.空降兵——一方面可以换一换血,另一方面坚决不能放到关键位置上。关键位置必需是“土生土长”的合适人选。

6.物质繁华时代,大家闲来没事侃一段,内容基本与性相关,或打着擦边球谓之幽默。按照80/20理论,生活中80%的人都喜欢或者习惯于与性相关的话题,20%的人感到厌恶或不耐烦。

7.不会长篇大论又有什么关系呢?关键的是你能看得透这世界乱七八糟的事情,即使只说几句,却那么一针见血。(我们的社会对思想者的需求已经远胜于演说家了,如果你还没有觉得,只因时代给你的局限性太大)

8.说得多了,你自然就相信了!

9.永远也不要放弃你的理想!

Flex Chart图表及其提示字体大小之CSS

在论坛上看到有朋友说不知道怎么调Flex图表的提示字体大小,写了下:
演示效果:

关键代码:

<mx:Style>
  ColumnChart{
   font-size:12;
   font-family:”MS YaHei”;
  }
  DataTip{
   font-size:12;
   font-family:”MS YaHei”;
  }
 </mx:Style>

完整代码下载:FlexChart.mxml (238)

Flex+Socket+Java聊天室模型(练习作品)

闲来无事,做个基于Java Socket套接字通讯的Flex聊天室,代码也简单,就两份代码:SocketServer.java 和 FlexConnectSocket.mxml

先看看Java的部分:

package com.hyj.socket;

import java.net.*;
import java.util.Vector;
import java.io.*;

public class SocketServer {
 private BufferedReader reader;
 private PrintWriter writer;
 private ServerSocket server;
 private Vector socketManager = new Vector();

 public SocketServer() {
 }

 void startServer() {
  try {
   server = new ServerSocket(886);
   System.out.println(“Socket Server Created!”);
   while (true) {
    System.out.println(“待命中……”);
    Socket socket = server.accept();
    new Socket_Thread(socket).start();
    socketManager.add(socket);
    System.out.println(“當前共有” + socketManager.size() + “個客戶端鏈接進來了”);
    for (int i = 0; i < socketManager.size(); i++) {
     Socket sock = (Socket) socketManager.get(i);
     writer = new PrintWriter(sock.getOutputStream(), true);
     writer.println(“NO當前共有” + socketManager.size()
       + “個客戶端鏈接進來了”);
     writer.flush();
    }
   }
  } catch (Exception e) {
   System.out.println(e);
  } finally {
   try {
    if (server != null)
     server.close();
    System.out.println(“服務關閉!”);
   } catch (IOException ie) {
   }
  }
 }

 class Socket_Thread extends Thread {
  Socket socket;
  private BufferedReader reader;

  Socket_Thread(Socket socket) {
   this.socket = socket;
  }

  public void run() {
   try {
    reader = new BufferedReader(new InputStreamReader(socket
      .getInputStream(), “UTF-8″));

    String msg;
    while ((msg = reader.readLine()) != null) {
     for (int i = 0; i < socketManager.size(); i++) {
      Socket sock = (Socket) socketManager.get(i);
      writer = new PrintWriter(sock.getOutputStream(), true);
      writer.println(msg);
      writer.flush();
      System.out.println(“接收到的信息為:” + msg);
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    socketManager.remove(socket);
    try {
     if (reader != null) {
      reader.close();
     }
     if (socket != null) {
      socket.close();
     }
     reader = null;
     socket = null;
     System.out.println(“客戶機離開了!還剩下” + socketManager.size()
       + “人”);

    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

 public static void main(String[] args) {
  SocketServer server = new SocketServer();
  server.startServer();
 }
}

内容也比较简单,随便看看就会了吧,接下来是Flex客户端的代码,关键只有三个地方:
socket.addEventListener(Event.CONNECT,connectedHandler);
socket.addEventListener(Event.CLOSE,closeHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA,getSocketDataHandler);
代码如下:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”
http://www.adobe.com/2006/mxml
    layout=”absolute”
    horizontalCenter=”0″
    creationComplete=”initApp()”
    horizontalAlign=”center”
    width=”516″
    height=”516″>

 <mx:Style>
  Application{
   font-family:”MS YaHei”;
   background-color:#FFFFFF;
   theme-color:#FFFFFF;
   padding-left:5;
   padding-top:5;
  }
  Panel{
   header-style-name:”fontStyle”;
  }
  .fontStyle{
   font-size:14;
   font-family:”MS YaHei”;
  }
  Alert{
   font-family:”MS YaHei”;
   font-size:12;
   color:#000000;
   theme-color:#FFFFFF;
   background-color:#FFFFFF;
   background-alpha:0.6;
  }
 </mx:Style>
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   import flash.utils.setTimeout;
   internal var socket:Socket=new Socket;

   private function initApp():void
   {
    currentState="GetName";

   }

   private function getSocketDataHandler(evt:ProgressEvent):void
   {
    while (socket.bytesAvailable)
    {
     var msg:String=socket.readMultiByte(socket.bytesAvailable, "utf8");
     //var msg:String = socket.readUTF();

     if (msg.substring(0, 2) == "NO")
     {
      userSize.text=msg.substring(2, msg.length - 1);
     }
     else
     {
      socket_txt.text+=msg;
      socket_txt.verticalScrollPosition=socket_txt.maxVerticalScrollPosition;
     }

    }
   }

   private function connectedHandler(evt:Event):void
   {
    Chat.title="鏈接服務器成功!";
   }

   private function closeHandler(evt:Event):void
   {

    Chat.title="鏈接已經關閉!";

   }

   public function sendMessage(msg:String):void
   {
    if (message_txt.text == "")
    {
     Alert.show("不能發送空信息,謝謝!");
    }
    else
    {

     if (socket.connected)
     {
      var message:ByteArray=new ByteArray();
      message.writeUTFBytes(msg + "\r\n"); //避免亂碼
      socket.writeBytes(message); //寫入socket緩沖區
      socket.flush(); //發送信息
      //socket_txt.text += msg+"\r\n";
      message_txt.text="";
     }
    }
   }

   private function login()
   {
    currentState='';
    socket.connect("10.129.90.27", 886);
    socket.addEventListener(Event.CONNECT, connectedHandler);
    socket.addEventListener(Event.CLOSE, closeHandler);
    socket.addEventListener(ProgressEvent.SOCKET_DATA, getSocketDataHandler);
   }
  ]]>
 </mx:Script>
 <mx:states>
  <mx:State name=”GetName”>
   <mx:RemoveChild target=”{Chat}”/>
   <mx:AddChild position=”lastChild”>
    <mx:Panel id=”reg”
        x=”1″
        y=”5″
        height=”448″
        width=”502″
        layout=”absolute”>
     <mx:TextInput id=”user”
          fontSize=”12″
          x=”161″
          y=”116″/>
     <mx:Button enabled=”{user.text==”?false:true}”
          fontSize=”12″
          x=”329″
          y=”116″
          label=”Button”
          click=”login()”/>
     <mx:Label fontSize=”12″
         x=”112″
         y=”118″
         text=”姓名:”/>
    </mx:Panel>
   </mx:AddChild>
  </mx:State>
 </mx:states>
 <mx:transitions>
  <mx:Transition fromState=”*”
        toState=”*”>
   <mx:Parallel>
    <mx:Iris target=”{Chat}”
       duration=”1200″/>
    <mx:Iris target=”{reg}”
       duration=”1200″/>
   </mx:Parallel>
  </mx:Transition>
 </mx:transitions>
 <mx:Panel fontSize=”12″
     layout=”absolute”
     id=”Chat”
     x=”1″
     y=”5″
     height=”501″
     width=”502″>
  <mx:TextArea id=”socket_txt”
      x=”34″
      y=”10″
      width=”400″
      height=”343″
      fontSize=”12″/>
  <mx:TextInput id=”message_txt”
       enter=”sendMessage(user.text+’:'+message_txt.text)”
       x=”105″
       y=”361″
       width=”259″
       fontSize=”12″/>
  <mx:Button click=”sendMessage(user.text+’:'+message_txt.text)”
       x=”372″
       y=”361″
       label=”Send”
       id=”button1″
       fontSize=”12″/>
  <mx:Label x=”34″
      y=”363″
      id=”userLabel”
      text=”{user.text+’:'}”/>
  <mx:Label x=”34″
      y=”392″
      id=”userSize”
      width=”400″/>
 </mx:Panel>
</mx:Application>

这只是一个模型,后续扩展基于这两个就可以了!~

工厂模式

原文地址:http://www.javaeye.com/topic/26455

简单工厂模式

1. 目的 
        工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。
2 . 简单工厂模式的结构 
 
Factory mode1

3. 一个简单例子 java 代码

  • // 产品接口         
  • public interface Product {   
  •   
  •     public void getName();   
  •   
  • }   
  •   
  • // 具体产品A   
  • public class ProductA implements Product {   
  •   
  •     public void getName() {   
  •         System.out.println(“  I am ProductA  ”);   
  •     }   
  •   
  • }   
  •   
  • // 具体产品B   
  • public class ProductB implements Product {   
  •   
  •     public void getName() {   
  •         System.out.println(“  I am ProductB  ”);   
  •     }   
  •   
  • }   
  •   
  • // 工厂类   
  • public class ProductCreator {   
  •   
  •     public Product createProduct(String type) {   
  •         if (“ A ”.equals(type)) {   
  •             return new ProductA();   
  •         }   
  •         if (“ B ”.equals(type)) {   
  •             return new ProductB();   
  •         } else  
  •             return null;   
  •     }   
  •   
  •     public static void main(String[] args) {   
  •         ProductCreator creator = new ProductCreator();   
  •         creator.createProduct(“ A ”).getName();   
  •         creator.createProduct(“ B ”).getName();   
  •     }   
  • }  
  • 4. 小结工厂模式的适用范围
    • 在编码时不能预见需要创建哪一种类的实例。
    • 一个类使用它的子类来创建对象。
    • 开发人员不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序。  

     

    抽象工厂模式 

    1. 抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。
    在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。
    2. 抽象工厂模式的结构 

     Factory mode2

    3. 一个简单例子

    java 代码

  • //  产品 Plant接口         
  • public interface Plant {   
  • }   
  •   
  • // 具体产品PlantA,PlantB   
  • public class PlantA implements Plant {   
  •   
  •     public PlantA() {   
  •         System.out.println(“ create PlantA ! ”);   
  •     }   
  •   
  •     public void doSomething() {   
  •         System.out.println(“  PlantA do something  ”);   
  •     }   
  • }   
  •   
  • public class PlantB implements Plant {   
  •     public PlantB() {   
  •         System.out.println(“ create PlantB ! ”);   
  •     }   
  •   
  •     public void doSomething() {   
  •         System.out.println(“  PlantB do something  ”);   
  •     }   
  • }   
  •   
  • // 产品 Fruit接口   
  • public interface Fruit {   
  • }   
  •   
  • // 具体产品FruitA,FruitB   
  • public class FruitA implements Fruit {   
  •     public FruitA() {   
  •         System.out.println(“ create FruitA ! ”);   
  •     }   
  •   
  •     public void doSomething() {   
  •         System.out.println(“  FruitA do something  ”);   
  •     }   
  • }   
  •   
  • public class FruitB implements Fruit {   
  •     public FruitB() {   
  •         System.out.println(“ create FruitB ! ”);   
  •     }   
  •   
  •     public void doSomething() {   
  •         System.out.println(“  FruitB do something  ”);   
  •     }   
  • }   
  •   
  • // 抽象工厂方法   
  • public interface AbstractFactory {   
  •     public Plant createPlant();   
  •   
  •     public Fruit createFruit();   
  • }   
  •   
  • // 具体工厂方法   
  • public class FactoryA implements AbstractFactory {   
  •     public Plant createPlant() {   
  •         return new PlantA();   
  •     }   
  •   
  •     public Fruit createFruit() {   
  •         return new FruitA();   
  •     }   
  • }   
  •   
  • public class FactoryB implements AbstractFactory {   
  •     public Plant createPlant() {   
  •         return new PlantB();   
  •     }   
  •   
  •     public Fruit createFruit() {   
  •         return new FruitB();   
  •     }   
  • }  
  • 4. 小结
    在以下情况下,应当考虑使用抽象工厂模式。
      首先,一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。
      其次,这个系统的产品有多于一个的产品族。
      第三,同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来。
      最后,不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节。
      其中第二丶第三个条件是我们选用抽象工厂模式而非其它形态的工厂模式的关键性条件。

    HttpService与JSP通讯及解决缓存问题

    先看段代码吧:

    <mx:HTTPService showBusyCursor=”true”
        url=”
    http://localhost:9998/FlexVoteSystem/SelectByUserIPFromVote.jsp
        id=”getUserIPFromVote”
        result=”getUserIPFromVoteResult();”
        fault=”Alert.show(event.fault.faultString);”
        useProxy=”false”>
     <mx:request>
      <Random>{Math.random()}</Random>
     </mx:request>
    </mx:HTTPService>

    <mx:request></mx:request>之间的内容表示向jsp发出的参数值,在jsp端用request.getParameter(“参数名”)即可收到。
    <Random>{Math.random()}</Random>表示向JSP页面传一个随机数,用于每次开启页面使用不同的httpservice,解决HTTPService缓存的问题,如果没有则浏览器引用同一个httpserice.

    顺便做个笔记:
    java获取IP:request.getRomoteHost();
    统计SQL:select vote_area,count(vote_areacount) from db_vote group by vote_area;
    今天又遇到HttpService报错:”Security Error”,具体是在本机上使用localhost没问题,把localhost换成IP地址或者机器名字则报错。而在同一局域网的其它PC上通过IP访问出现404错误。加上crossdomain.xml后,404错误解决了,”Security Error”问题就依然在。调试后把httpservice中的url内的localhost换成ip就可以了,不过这个时候使用localhost来访问就依然有问题。暂时不知道该怎么解决,先纪录一下吧。或许正式的应用环境中直接使用域名就可以了吧。

    AIR 2.0 新特性详细介绍

    文章来源:http://bbs.airia.cn/FLEX/thread-7826-1-1.aspx

     

    新功能

    File Promises
           File promises 是一个新的API(URLFilePromise)。要从AIR应用程序下载文件,用这个API十分方便。因为你只需把文件的URL从AIR程序窗口拖出到本机上,文件就会开始下载。效果就像你需要从QQ共享里下载文件一样,把它拖到桌面上,文件便会自动下载到你的桌面上。

    var items:Array = fileData.selectedItems;
    var promises:Array = new Array();
    for each (var item:Object in items)
    {
           var filePromise:URLFilePromise = new URLFilePromise();
           var request:URLRequest = new URLRequest(item.url);

           filePromise.request = request;
           filePromise.relativePath = item.name;
           promises.push(filePromise);
    }

    clipboard.setDate(ClipboardFormats.FILE_PROMISE_LIST_FORMAT, promises);
    NativeDragManager.doDrag(fileDate, clipboard);

    屏幕阅读器(Screen reader)
           从前AIR里的文字是不被屏幕所认知的。AIR 2.0 终于可被屏幕阅读了。什么意思呢?我想应该就像金山词霸的“屏幕取词”功能一样,你把鼠标放在AIR里的文字上,就可以使用金山词霸来翻译了(现在我是用灵格斯的“剪贴板取词”)。不过,在此版本只支持 Windows 操作系统。以下特性已经添加:

    • 运行时对话框—对话框可被屏幕阅读器阅读了;
    • Flex组件和窗口—Flex组件和窗口可被屏幕阅读器阅读了;

    本地进程(应用程序)
           与使用默认应用程序打开文件类似,AIR 2.0 可以运行本地进程并且与它进行交互。这个新特性只适用于应用程序是用本地系统安装程序安装的情况下。以下类已被支持:

    • flash.desktop.NativeProcess — 集成了命令行并且可在本机运行。当某个进程运行后,AIR应用程序可以监听它的输入数据、输出数据以及错信息;
    • flash.desktop.NativeProcessStartupInfo — 提供了在本机启动一个进程所需的基本信息;
    • flash.events.NativeProcessExitEvent — 当进程退出时调度此事件。这个事件有可能不会被调度,当子进程比AIR应用程序的生命周期要长时。

    新的网络支持

    • IPv6 支持
      AIR 2.0 对所有网络API新增了IPv6的支持。目前互联网大多数在使用IPv4,它已经有20历史了。
    • 用户数据报协议
      在已有的Socket类之上添加了新的socket类。已有的类支持TCP协议,而在AIR 2.0里新增了 DatagramSocket 类以支持UDP协议。DatagramSocket 类允许发送和接收 UDP 数据包。

    增强功能的API

    NativeWindow 的最大尺寸
           在 AIR 1.5.2 时代 NativeWindow 的最大尺寸是 2880×2880 像素,而在 AIR 2.0 里将提升到 4095×4095 像素。

    空闲超时
           允许设置空闲超时值(只支持win/Mac)。

    Mac上的矢量印刷
           AIR 1.5 在 Windows 上支持了矢量印刷(flash.printing.PrintJob)。AIR 2.0 将会在 Mac 上支持这特性。

    数据库的业务保存点
           在 AIR 1.5 里,SQLConnection 类支持业务(transactions)。业务允许用户跟踪SQL命令并在需要时提交或退回。AIR 2.0 里新增了这些方法:savepoints()、setSavepoint()、releaseSavepoint()以及rollbackToSavePoint()。

    麦克风访问API
           AIR 2.0 提供了可以访问未压缩的PCM字节数据的麦克风API了。具体查看手册里的 SampleDataEvent.SAMPLE_DATE 事件。

    使用默认应用程序打开文件
           新增了 openWithDefaultApplication() 方法,可使用系统的默认应用程序打开文件。当你使用此方法时,文件会被已在系统上注册了的默认应用程序打开。如果文件是可执行文件(例如:*.exe),那么它会直接执行。

    跟平台有关的APIs

    多点触摸功能
           MultitouchInputMode 是一个枚举类,存放着三种多点触摸硬件类型:

    GETTURE = “getture”
    NONE = “none”
    TOUCH_POINT = “touchPoint”

    首先你需要设置 Multitouch 类的硬件类型,然后你就可以开始监听事件了。

    存储器(Storage Volume)监听
           Adobe 说:真失策,在以往的版本里居然遗漏了这个功能。AIR 2.0 提供了对系统的存储器信息访问和监听的API。通过这些API,你不仅可以访问到硬盘文件系统,同时还可以监听通过USB或火线进行连接的移动存储设备,例如移动硬盘和以存储方式连接到计算机的相机,MP3或手机等等。这两个类可以帮到你: