键盘上的舞者

像写情书一样Coding...
随笔 - 20, 文章 - 0, 评论 - 15, 引用 - 0
数据加载中……

2009年9月14日

Node的属性改变后通知属性表单(Propertites Sheet)更新

Node API提供了一个方法在Node属性集变化时通知注册在其上的监听器更新。
protected final void firePropertySetsChange(Node.PropertySet[] o, Node.PropertySet[] n)

如图,精灵动画就是一个自定义的Node,当使用鼠标将Node从A点拖拽到B点时,Node坐标已经改变,可以调用Node的firePropertySetsChange()方法通知属性表单(Propertites Sheet)更新显示。


因为firePropertySetsChange()是个受保护(protected)的方法,如果需要在Node的外部调用,还可以包装在自定义的公共(public)方法里。
public void notifySheetChange(){
    firePropertySetsChange(
null, Sheet.createDefault().toArray());
}

posted @ 2011-03-06 22:15 陈维 阅读(1233) | 评论 (1)编辑 收藏

使用TopComponent群组

TopComponent群组的作用是在打开一个TopComponent组件的同时,打开其他相关的TopComponent组件。例如,当打开或者激活GUI编辑器的时候,“组件面板”、“属性”窗口和“检查器”窗口都会出现。当需要一个组件同时伴随着很多其他类似于组件面板窗口的时候,利用TopComponent群组可以轻松实现一个组件的激活引发其他组件被打开或者被选中。

定义群组涉及到2XML文件。首先是wsgrp,它代表“窗口系统群组(Window System Group)”。它定义了“窗口系统”的群组,系统根据它的定义查找对应的目录,它也定义了群组是否应该在启动时打开。另一个文件是wstcgrp,它代表“窗口系统TopComponent群组(Window System TopComponent Group)”,这个文件通过ID识别单态的TopComponent组件,同时还定义了一些群组的打开和关闭属性。

TopComponent群组编程实例

首先创建一个模块项目TopComponentGroup然后新建2个窗口组件(TopComponent),命名为EditorTopComponentSatelliteTopComponent,就像窗口的名字所表示的那样,SatelliteTopComponent将会随着EditorTopComponent的打开和关闭一同打开和关闭。

首先新建一个名为EditorGroupWsgrpxml文件,这个文件里定义了名为EditorGroup的编辑器窗口群组。
<group version="2.0">
    
<module name="org.jqueen.nb.topcomponentgroup" spec="1.0" />
    
<name unique="EditorGroup" />
    
<state opened="false" />
</group>

再新建一个名为SatelliteTopComponentWstcgrp的xml文件,在这个文件里可以通过ID识别出SatelliteTopComponent组件
<tc-group version="2.0">
    
<tc-id id="SatelliteTopComponent" />
    
<open-close-behavior open="true" close="true" />
</tc-group>

编辑模块的layer.xml文件,在系统文件系统中的Windows2目录添加一个Group文件夹,将名为"EditorGroup"的群组添加进Group。
<folder name="Groups">
    
<file name="EditorGroup.wsgrp" url="EditorGroupWsgrp.xml"/>
    
<folder name="EditorGroup">
        
<file name="SatelliteTopComponent.wstcgrp" url="SatelliteTopComponentWstcgrp.xml"/>
    
</folder>
</folder>

编辑EditorTopComponent内容,重写TopComponent类的componentOpened()和componentClosed()方法,在EditorTopComponent被打开和关闭时打开和关闭名为"EditorGroup"的群组。
    @Override
    
protected void componentOpened() {
        TopComponentGroup group 
= WindowManager.getDefault().findTopComponentGroup("EditorGroup");
        
if (group != null) {
            group.open();
        }
    }

    @Override
    
public void componentClosed() {
        TopComponentGroup group 
= WindowManager.getDefault().findTopComponentGroup("EditorGroup");
        
if (group != null) {
            group.close();
        }
    }

至此,就完成了一个TopComponent群组的编辑。执行模块项目,当从窗口菜单中打开EditorTopComponent时SatelliteTopComponent会自动打开,EditorTopComponent被关闭时SatelliteTopComponent也会自动关闭。

样例程序下载

posted @ 2010-08-07 22:46 陈维 阅读(1578) | 评论 (0)编辑 收藏

JavaFX进行HTTP Basic认证

最近用JavaFX写一个应用调用Internet上的开放API时需要进行HTTP Basic认证,JavaFX提供了一个类HttpRequest用于发送Web服务的请求,类HttpHeader顾名思义就是用来表示HTTP请求的"Header"了。HttpHeader提供了一个很方便的方法用来创建HTTP Basic认证需要的用户名和密码"Header":
public basicAuth(username: java.lang.String, password: java.lang.String) : HttpHeader
下面就看一下如何使用JavaFX编写进行HTTP Basic认证的代码:
// var user = "user";
// var password = "password";
HttpRequest{
    location: 
// url
    headers: HttpHeader.basicAuth(user, password)
    
// 
}.start();

posted @ 2010-04-25 02:49 陈维 阅读(1503) | 评论 (0)编辑 收藏

本公司的几个开发类职位的招聘(上海)

有兴趣的朋友可以先给我发简历,谢谢谢谢谢谢谢谢。
chenweionline#hotmail.com

公司基本信息可以访问
www.jaiziworld.com
www.ccjoy.com

51job上的发布链接
http://search.51job.com/list/co,c,2088688,0000,10,1.html

Java/JavaFX富客户端应用开发工程师

岗位职责:
在Java平台上进行网络游戏相关客户端产品的研发。

任职要求:
1.Java SE基础扎实,了解常用设计模式并且能够在开发过程用适当的应用;
2.熟悉AWT/Swing,Java 2D,JavaFX,NetBeans Platform编程技术;
3.诚实守信,具有良好的团队合作精神,具有迎接挑战的信心和对工作的激情。

优先条件:
1.熟悉游戏相关业务或者有相关游戏、编辑器工具开发经验者;
2.熟悉JavaScript,Flash/Flex,Silverlight等其他RIA开发技术;
3.熟悉Java ME,Android,Windows Mobile,Symbian,iPhone等移动技术平台开发。


Java服务器端开发工程师

岗位职责:
1.具备良好的分析解决问题能力,能独立承担任务和有系统进度把控能力;
2.负责网络游戏服务器端应用逻辑的编写,分布式系统的架构设计;
3.编写相关的开发文档;
4.与项目组美术与策划人员深入沟通,准确实现开发需求。

任职要求:
1.熟悉Java语言,熟练掌握J2EE相关技术;
2.熟悉常用设计模式、数据结构、算法;
3.熟练使用:eclipse、PowerDesigner、UML建模、Word、Excel等常用开发工具。

优先条件:
1.熟悉游戏相关业务或者有相关开发经验者。


移动设备应用开发工程师

岗位职责:
1.在主流的移动平台上开发互联网服务产品。

任职要求:
1.可以熟练使用JavaME,Android或iPhone平台编程技术进行开发。

优先条件:
1.2年以上移动平台应用开发经验;
2.具有个人作品者优先。


游戏算法研发工程师

岗位职责:
1.从事网络游戏相关的技术研发和算法优化工作。

任职要求:
1.数学、人工智能或计算机专业硕士以上学历,数学基础扎实;
2.熟悉图像处理、模式识别、计算机视觉等方面的知识;
3.熟练掌握数值计算相关理论和方法,对算法的并行处理和优化有经验的优先;
4.能够编写技术文档。

优先条件:
1.熟悉Java语言优先

posted @ 2010-04-15 15:24 陈维 阅读(249) | 评论 (0)编辑 收藏

JavaFX开发模仿Mac OS的MagicalDock(鱼眼效果)

launch
MagicalDock修改了上个版本的设计,目前的思路是使用2个容器类Container和Flow完成布局,Flow为Node提供水平布局,Container是Flow的容器。
当鼠标移动到Node上,Node大小变化时会改变Flow的尺寸范围,这时动态调整Flow在Container中的位置完成水平位移效果并且将锚定Node的底部使一组Node在变化时都能够底线对齐。

posted @ 2010-04-09 17:58 陈维 阅读(1956) | 评论 (2)编辑 收藏

SOSHaiti(Preview) - Game In JavaFX

开发中的一个版本,先睹为快,希望有更多的开发者关注JavaFX技术。

2010年3月22日更新:
1.修正游戏结束时不显示得分的BUG
2.增加一个Menu菜单,在游戏进行中可暂停游戏
3.添加物体间的碰撞特性(使用JBox2D)

posted @ 2010-03-12 22:25 陈维 阅读(1943) | 评论 (6)编辑 收藏

JavaFX编译器编译重载方法的一处BUG

直接看测试代码吧,一共2个类:BugTest.fx和A.fx,SDK版本是1.2.3。
/*
 * BugTest.fx
 *
 * Created on 2010-2-25, 22:05:11
 
*/
package org.jqueen.fx.bug;

/**
 * 
@author Leon
 
*/
public class BugTest {

// 取消该方法注释编译将抛出异常
//    function test(a: A): Void {
//        test(5);
//    }

    function test(s: String): Void {
        test(
5);
    }

    function test(i: Integer): Void {
    }

}
/*
 * A.fx
 *
 * Created on 2010-2-25, 22:10:45
 
*/

package org.jqueen.fx.bug;

/**
 * 
@author Leon
 
*/

public mixin class A {}
BugTest里实现了3个带输入参数的重载方法,第一个方法的参数是自定义类型A,A被声明为mixin,后2个的参数是原始类型。只有在第一个方法被注释的情况下该类才可以被编译通过,否则编译器会抛出异常:
An exception has occurred in the OpenJavafx compiler. Please file a bug at the Openjfx-compiler issues home (https://openjfx-compiler.dev.java.net/Issues) after checking for duplicates. Include the following diagnostic in your report and, if possible, the source code which triggered this problem.  Thank you.
java.lang.ClassCastException: com.sun.tools.javac.code.Symbol$ClassSymbol
        at com.sun.tools.javafx.code.JavafxTypes.asSuper(JavafxTypes.java:202)
        at com.sun.tools.javac.code.Types.isSubtypeUnchecked(Types.java:305)
        at com.sun.tools.javafx.comp.JavafxResolve.argumentsAcceptable(JavafxResolve.java:421)
        at com.sun.tools.javafx.comp.JavafxResolve.rawInstantiate(JavafxResolve.java:387)
        at com.sun.tools.javafx.comp.JavafxResolve.selectBest(JavafxResolve.java:711)
        at com.sun.tools.javafx.comp.JavafxResolve.findMemberWithoutAccessChecks(JavafxResolve.java:952)
        at com.sun.tools.javafx.comp.JavafxResolve.findMember(JavafxResolve.java:906)
        at com.sun.tools.javafx.comp.JavafxResolve.findMember(JavafxResolve.java:886)
        at com.sun.tools.javafx.comp.JavafxResolve.findVar(JavafxResolve.java:567)
        at com.sun.tools.javafx.comp.JavafxResolve.findIdent(JavafxResolve.java:1228)
        at com.sun.tools.javafx.comp.JavafxResolve.resolveIdent(JavafxResolve.java:1423)
        at com.sun.tools.javafx.comp.JavafxAttr.visitIdent(JavafxAttr.java:506)
        at com.sun.tools.javafx.tree.JFXIdent.accept(JFXIdent.java:52)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:311)
        at com.sun.tools.javafx.comp.JavafxAttr.visitFunctionInvocation(JavafxAttr.java:2239)
        at com.sun.tools.javafx.tree.JFXFunctionInvocation.accept(JFXFunctionInvocation.java:53)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:303)
        at com.sun.tools.javafx.comp.JavafxAttr.visitBlockExpression(JavafxAttr.java:1373)
        at com.sun.tools.javafx.tree.JFXBlock.accept(JFXBlock.java:83)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:311)
        at com.sun.tools.javafx.comp.JavafxAttr.finishFunctionDefinition(JavafxAttr.java:1863)
        at com.sun.tools.javafx.comp.JavafxMemberEnter$SymbolCompleter.complete(JavafxMemberEnter.java:646)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:400)
        at com.sun.tools.javafx.comp.JavafxAttr.visitFunctionDefinition(JavafxAttr.java:1658)
        at com.sun.tools.javafx.tree.JFXFunctionDefinition.accept(JFXFunctionDefinition.java:93)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:321)
        at com.sun.tools.javafx.comp.JavafxMemberEnter$SymbolCompleter.complete(JavafxMemberEnter.java:643)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:400)
        at com.sun.tools.javafx.comp.JavafxResolve.findMemberWithoutAccessChecks(JavafxResolve.java:943)
        at com.sun.tools.javafx.comp.JavafxResolve.findMember(JavafxResolve.java:906)
        at com.sun.tools.javafx.comp.JavafxResolve.findMember(JavafxResolve.java:886)
        at com.sun.tools.javafx.comp.JavafxResolve.findVar(JavafxResolve.java:567)
        at com.sun.tools.javafx.comp.JavafxResolve.findIdent(JavafxResolve.java:1228)
        at com.sun.tools.javafx.comp.JavafxResolve.resolveIdent(JavafxResolve.java:1423)
        at com.sun.tools.javafx.comp.JavafxAttr.visitIdent(JavafxAttr.java:506)
        at com.sun.tools.javafx.tree.JFXIdent.accept(JFXIdent.java:52)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:311)
        at com.sun.tools.javafx.comp.JavafxAttr.visitFunctionInvocation(JavafxAttr.java:2239)
        at com.sun.tools.javafx.tree.JFXFunctionInvocation.accept(JFXFunctionInvocation.java:53)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:303)
        at com.sun.tools.javafx.comp.JavafxAttr.visitBlockExpression(JavafxAttr.java:1373)
        at com.sun.tools.javafx.tree.JFXBlock.accept(JFXBlock.java:83)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribExpr(JavafxAttr.java:311)
        at com.sun.tools.javafx.comp.JavafxAttr.finishFunctionDefinition(JavafxAttr.java:1863)
        at com.sun.tools.javafx.comp.JavafxMemberEnter$SymbolCompleter.complete(JavafxMemberEnter.java:646)
        at com.sun.tools.javac.code.Symbol.complete(Symbol.java:400)
        at com.sun.tools.javafx.comp.JavafxAttr.visitFunctionDefinition(JavafxAttr.java:1658)
        at com.sun.tools.javafx.tree.JFXFunctionDefinition.accept(JFXFunctionDefinition.java:93)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:280)
        at com.sun.tools.javafx.comp.JavafxAttr.attribTree(JavafxAttr.java:265)
        at com.sun.tools.javafx.comp.JavafxAttr.attribDecl(JavafxAttr.java:334)
        at com.sun.tools.javafx.comp.JavafxAttr.attribClassBody(JavafxAttr.java:3696)
        at com.sun.tools.javafx.comp.JavafxAttr.attribClass(JavafxAttr.java:2808)
        at com.sun.tools.javafx.comp.JavafxAttr.attribClass(JavafxAttr.java:2763)
        at com.sun.tools.javafx.main.JavafxCompiler.attribute(JavafxCompiler.java:936)
        at com.sun.tools.javafx.main.JavafxCompiler.compile2(JavafxCompiler.java:782)
        at com.sun.tools.javafx.main.JavafxCompiler.compile(JavafxCompiler.java:685)
        at com.sun.tools.javafx.main.Main.compile(Main.java:624)
        at com.sun.tools.javafx.main.Main.compile(Main.java:312)
        at com.sun.tools.javafx.Main.compile(Main.java:84)
        at com.sun.tools.javafx.Main.main(Main.java:69)

posted @ 2010-02-25 23:35 陈维 阅读(1563) | 评论 (1)编辑 收藏

JavaFX项目发布时虚拟机参数设置方法

我一直是使用NetBeans IDE开发JavaFX项目,JavaFX项目编译后会在项目目录下建立一个dist文件夹,文件夹包含你的程序和另外3个发布文件,发布文件分别是XXX.html、XXX.jnlp和XXX_browser.jnlp,如果需要设置JavaFX程序运行时的虚拟机参数,那么可以根据你的发布方式选择在XXX.jnlp或者XXX_browser.jnlp里做出修改,它们都是标准的Java网络加载协议文件。

例如,我选择把应用发布到浏览器,那么我使用文本编辑器打开文件XXX_browser.jnlp,在<resources>节点下默认有一个节点<j2se version="1.5+"/>用于描述程序运行需要的JRE版本,我们把它修改为<j2se version="1.5+" java-vm-args="-Xmx256m" />,这样,我们的应用在运行时就可以使用最大256m的内存了。同理,可以设置更多的虚拟机参数,就不一一举例了。

posted @ 2009-12-21 17:02 陈维 阅读(1387) | 评论 (0)编辑 收藏

JavaFX实现一个简单的模态窗口

JavaFX直到目前最新的1.2.1版本里没有提供模态窗口或着对话框,我在项目里通过扩展Control自己实现了一个简单的模态窗口,控件由2个类Window.fx和WindowSkin.fx组成,在WindowSkin里实现了Skin的抽象方法contains,在模态下始终返回true。

下面是控件的源码和一个演示demo。

Window.fx
package org.jqueen.fx.scene.control;

import javafx.scene.Node;
import javafx.scene.image.Image;
import javafx.scene.control.Control;

/**
 * 
@author Leon Chen
 
*/
public class Window extends Control {

    
public var modal: Boolean;
    
public var background: Image;
    
public var content: Node[];

    override 
protected function create(): Node {
        skin 
= WindowSkin {};
        
super.create();
        }
}

WindowSkin.fx
package org.jqueen.fx.scene.control;

import javafx.scene.control.Skin;
import javafx.scene.Group;
import javafx.scene.image.ImageView;

/**
 * 
@author Leon Chen
 
*/
package class WindowSkin extends Skin {

    def windowControl 
= bind control as Window;
    def bounds : Bounds = bind windowControl.boundsInLocal;
    def background 
= ImageView {
                image: bind windowControl.background
            };
    def content 
= bind windowControl.content;
    
    init {
        node 
= Group {
            content: bind[background, content]
        }
    }

    override 
public function intersects(localX: Number, localY: Number, localWidth: Number, localHeight: Number): Boolean {
        
return bounds.intersects(localX, localY, localWidth, localHeight);
    }

    override 
public function contains(localX: Number, localY: Number): Boolean {
        
if (windowControl.modal) {
            
return true;
            } 
else {
            
return bounds.contains(localX, localY);
            }
    }
}



点击图片可运行程序,非模态时背景可以监听到鼠标事件。

posted @ 2009-12-19 02:45 陈维 阅读(1951) | 评论 (0)编辑 收藏

与NetBeans6.8无关

今天NetBeans 6.8正式发布,作为粉丝当然第一时间去官网下载。
随手点开了Overview视频,视频随后部分介绍了一些基于NetBeans Platform开发的富客户端应用,在5分53秒突然一张很熟悉的抓图跃入眼帘,那是我在07年在NetBeans 5.5上开发的一个图像处理富客户端应用,兴奋之余又开始习惯性的反省,这2年在Platform开发上没什么成绩,要努力。



posted @ 2009-12-11 21:12 陈维 阅读(225) | 评论 (0)编辑 收藏

JavaFX实现鱼眼菜单 v0.1

FisheyeMenu
点击图片可运行程序

posted @ 2009-12-06 02:27 陈维 阅读(1833) | 评论 (3)编辑 收藏

Inkscape提供将绘制保存为JavaFX的支持

Inkscape是一个基于标准的SVG文件格式的开源矢量图编辑器,在最新的0.47版本里添加了将绘制保存为JavaFX的支持。
它将所有的绘制保存在一个继承自CustomNode的JavaFX源文件里,目前只支持保存JavaFX源文件(.fx),不支持FXZ,不支持动画。(可能以后也不会支持动画,毕竟不是专注JavaFX的设计工具

posted @ 2009-12-03 19:39 陈维 阅读(1057) | 评论 (0)编辑 收藏

使用JavaFX时间轴(Timeline)编写的等待动画



(点击图片运行程序)

项目源代码下载:
http://www.blogjava.net/Files/chenweionline/WaitingPaneFX.rar

posted @ 2009-10-19 21:39 陈维 阅读(3177) | 评论 (1)编辑 收藏

JavaFX中实例化Java类对象

如果Java类对象拥有不带参数的构造函数,那么可以在JavaFX代码里直接实例化:
var var1 = ArrayList{};

如果目标Java类只有带参数的构造函数就有些麻烦,需要分2步进行,首先新建一个Java工具类JavaUtils.java,在这个类里将你目标类实例化完成后通过赋值语句将其赋值给JavaFX变量:

1、编写JavaUtils.java
import java.net.MalformedURLException;  
import java.net.URL;  
/** 
 * 
 * 
@author Leon Chen 
 
*/  
public class JavaUtils {  
    
public static URL getURL(String spec) throws MalformedURLException{  
        
return new URL(spec);  
    }  
}

2、在JavaFX代码里使用JavaUtils生成URL类实例
var url = JavaUtils.getURL(“http://www.jqueen.org”);

目前JavaFX版本为1.2,在Java和JavaFX代码的相互调用上还有很多不方便的地方,希望以后的版本会有改进。

posted @ 2009-10-15 22:16 陈维 阅读(1377) | 评论 (1)编辑 收藏

Visual Library 2.0 - Examples

Visual Library是NetBeans中广泛使用的可视化函数库,用于展现复杂的上下文关系,如建模或流程绘图等工作。

Visual Library源自于NetBeans的社区项目,随着类库逐步发展成熟并被开发者认可,在2007年正式成为NetBeans Platform. 6.0的一部分。目前的NetBeans IDE中,BPEL业务流程设计器,Mobile开发以及JavaEE开发的设计工具都在使用Visual Library来实现可视化编辑效果。

Visual Library 2.0版本在使用时的编程风格同Swing类似,需要创建Scene场景包含,并使用Widgets生成所需的可视化元素,之后通过Scene场景的 createView操作来创建Swing的JComponent组件,以将可视化场景集成在Swing界面中呈现。

关于Visual Library的使用,官方站点已经给出非常好的示例代码,以展示Visual Library提供的几十种不同的功能和用法,包含Action的使用,可视化组件的生成与连接等。

示例代码下载页面:

http://graph.netbeans.org/examples.html

使用Visual Library开发的几个案例截图:

posted @ 2009-09-14 20:58 陈维 阅读(170) | 评论 (0)编辑 收藏

使用文件模板和向导创建一个类型文件

     摘要: 通过工具创建类型文件时通常会使用到各式各样的模板,例如IDE在创建java文件时会自动在文件头添加作者和创建日期的注释、XML文件会自动添加根元素的标签等。在NetBeans里通过使用文件模板可以很方便的按照既定的模式创建你的类型文件。 我在《创建新的文件类型 》里介绍了怎样创建一个自定义的文件类型,创建后的文件类型里就包含了一个名为MapTemplate.xmap的空文件模板。现在我们将...  阅读全文

posted @ 2009-09-14 20:45 陈维 阅读(577) | 评论 (0)编辑 收藏

创建新的文件类型

我们在开发过程中经常会根据数据组织形式的不同创造新数据格式,例如我为开发2D游戏地图所创造的xmap格式。NetNeans很方便的提供了对新数据格式的支持,我们现在就可以动手创建自己的文件格式。

我们首先新建一个名为“Map Core”的模块项目,然后在这个模块里创建一个新的文件类型。

创建文件类型的过程如下:

1、点击菜单栏的新建文件选项,在弹出的向导对话框的类别列表里选择“模块开发”,在文件类型列表里选择“文件类型”,然后点击“下一步”按钮


2、在文件识别面板,MIME类型输入框里输入我们自定义类型“text/x-map”,然后在文件扩展名输入框里输入文件扩展名“xmap”。文件扩展 名可以输入多个,用空格或者逗号分隔。如此可以使得这个新文件类型支持多种后缀的文件,例如jpg,jpeg后缀皆表示JPEG图像格式。输入完成后进行 下一步操作。



3、最后在输入类名前缀、图标和在磁盘上生成文件的位置,点击“完成”后NetBeans会根据输入自动生成和配置相关的几个文件。



我们已经成功创建了自己的MIME文件类型“text/x-map”,检查一下项目文件夹,NetBeans为我们自动创建了几个文件:

Icon_Map.gif 自定义xmap文件的默认图标。

MapDataObject.java 当系统发现xmap文件时会创造一个MapDataObject对象用来表示文件的内容。

MapResolver.xml 作为MIME类型解析器,它描述了“text/x-map”类型的文件后缀用于生成DataObject对象。

MapTemplate.xmap 这是一个xmap文件模板,我们可以在其中添加标准的内容后使用这个模板创建新的地图文件。

layer.xml 添加了内容用于注册MIME类型解析器和文件模板以及一系列标准操作,例如复制、粘贴等。



最后,我们将项目编译后在目标平台中重新装入,来检验新的文件类型。现在可以看到xmap类型的文件在安装了MapCore模块的目标平台上显示时和其他文件已经有所区别,使用了我们自己创建的图标,说明xmap类型文件已经被识别。

 

posted @ 2009-09-14 20:23 陈维 阅读(900) | 评论 (0)编辑 收藏

创建NetBeans模块项目

学习NetBeans模块开发首先需要做的就是创建一个NetBenas的模块项目,使用NetNeans IDE提供的新建项目向导只需要经过4个步骤就可以新建一个模块项目。

1、首先IDE菜单中的新建项目创建一个新项目,在向导对话框中的项目类别选择“NetBeans 模块”,项目选择“模块”。



2、下一步填写项目名称和项目所在的磁盘位置。我将项目命名为“MapCore”。



3、接下来填写代码名称基和模块显示名称。项目名称基的作用类似于Java类的包名,用来标识一个NB模块。模块显示名称顾名思义模块用于显示的名字。


4、点击“完成”按钮结束MapCore模块的创建,创建后的项目文件结构如下:


posted @ 2009-09-14 20:19 陈维 阅读(294) | 评论 (0)编辑 收藏

将你的文件类型集合进XML编辑器(第二部分)

我发现了昨天的错误。不用将 MultiDataObject 替换成 XMLDataObject,你只需要简单地确认 MIME 类型是以"+xml"结尾。例如,类似 text/x-foo+xml。一旦你这样做了,你的文档就会在 XML 编辑器里 打开。换句话说,你拥有免费的语法着色,简单的确保 MIME 类型正确。根据昨天 Blog 里 描述 的4个步骤 增加 Cookies 可以为你提供 XML 的检查、验证和根据 XSLT 改变功能。诸如此类,事实上 尽管那个文件类型不是以".xml"结尾。

最后,添加一个导航器,以便我们能够获取我们的 XML 文件提纲和便于我们在导航器里节点的跳跃关联到 XML 编辑器。

在这里教你怎样添加 XML 导航器:

1、必须确保你的 MIME 类型处于 text/x-foo+xml 模式,否则 XML 导航器将不会工作。当我们点击一个节点,一个行的文档将会打开,并且新的文档不含有语法着色,换句话说,你的文档内容将打开在一般的文本编辑器里。从3个地方可以看出你的 MIME 类型是否正确,MIME 类型的 resolver、Layer 文件和 DataLoader。(译者注:NB6.5 上验证需要检查 XxxResolver.xml 和 layer.xml 文件)

2、在重要文件节点里,展开<XML 层>和其中的<上下文中的此层>。找到导航文件夹,在导航文件夹里创建一个新的文件夹。这个文件夹的名字必须和你的 MIME 类型相同。然后复制XML文件夹下的内容到你的文件夹里。祝贺你,你已经制作了XML导航器用于激活你的 MIME 类型。

3、安装模块。如果你安装在开发 IDE 上,你就必须重新启动 IDE 使 XML 导航器注册生效。


现在,每当文档得到焦点,XML导航器就会显示文档的提纲。另外,你可以使用 XML 导航器导航到文档的任何地方,就像显示的那样:

navigator-for-own-file-type-xml.png



原文地址:http://blogs.sun.com/geertjan/entry/integrating_the_xml_editor_for


posted @ 2009-09-14 20:03 陈维 阅读(115) | 评论 (0)编辑 收藏

将你的文件类型集合进XML编辑器(第一部分)

感谢 Vadiraj 的帮助,我现在知道了如何在XML编辑器里打开非XML文件。有时候你拥有一个内容是XML但是却并非以“.xml”结尾的文件。如何让IDE把它看作一 个XML文件呢?接下来你可以看到一个后缀为“.test”的文件在XML编辑器里被打开。你知道它被打开是因为语法着色和缩进,以及XML文件特有的附 加菜单项:

own-extension-xml.png

1、使用文件类型向导,会创建一些不同的类。只需要修改名为 XxxDataObject 的类。

2、为模块依赖关系添加 XML Tools API。

3、在 DataObject 里,将继承的类由 MultiDataObject 改为 XMLDataObject。

4、在构造函数里补充验证 XML、确认 XML 和使用 XSLT 改变 XML 样式等附加功能所提供的 Cookies,像这样:

public TestDataObject(FileObject pf, TestDataLoader loader) throws DataObjectExistsException, IOException {
    
super(pf, loader);
    CookieSet cookies 
= getCookieSet();
    InputSource is 
= DataObjectAdapters.inputSource(this);
    Source source 
= DataObjectAdapters.source(this);
    cookies.add(
new CheckXMLSupport(is));
    cookies.add(
new ValidateXMLSupport(is));
    cookies.add(
new TransformableSupport(source));
    cookies.add((Node.Cookie) DataEditorSupport.create(
this, getPrimaryEntry(), cookies));
}

5、确认导入合适的声明。

import java.io.IOException;
import javax.xml.transform.Source;
import org.netbeans.spi.xml.cookies.CheckXMLSupport;
import org.netbeans.spi.xml.cookies.DataObjectAdapters;
import org.netbeans.spi.xml.cookies.TransformableSupport;
import org.netbeans.spi.xml.cookies.ValidateXMLSupport;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObjectExistsException;
import org.openide.loaders.XMLDataObject;
import org.openide.nodes.CookieSet;
import org.openide.nodes.Node;
import org.openide.text.DataEditorSupport;
import org.xml.sax.InputSource;

就这样,你已经完成。你的文件现在可以被看作是一个 XML 文件,就像其他所有的 XML 文件一样。



原文地址:http://blogs.sun.com/geertjan/entry/integrating_the_xml_edior_for

posted @ 2009-09-14 20:01 陈维 阅读(180) | 评论 (0)编辑 收藏