鍵盤上的舞者

          像寫情書一樣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 陳維 閱讀(1247) | 評論 (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 陳維 閱讀(1587) | 評論 (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 陳維 閱讀(1513) | 評論 (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 陳維 閱讀(256) | 評論 (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 陳維 閱讀(1971) | 評論 (2)編輯 收藏

          SOSHaiti(Preview) - Game In JavaFX

          開發中的一個版本,先睹為快,希望有更多的開發者關注JavaFX技術。

          2010年3月22日更新:
          1.修正游戲結束時不顯示得分的BUG
          2.增加一個Menu菜單,在游戲進行中可暫停游戲
          3.添加物體間的碰撞特性(使用JBox2D)

          posted @ 2010-03-12 22:25 陳維 閱讀(1988) | 評論 (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 陳維 閱讀(1600) | 評論 (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 陳維 閱讀(1400) | 評論 (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 陳維 閱讀(1958) | 評論 (0)編輯 收藏

          與NetBeans6.8無關

          今天NetBeans 6.8正式發布,作為粉絲當然第一時間去官網下載。
          隨手點開了Overview視頻,視頻隨后部分介紹了一些基于NetBeans Platform開發的富客戶端應用,在5分53秒突然一張很熟悉的抓圖躍入眼簾,那是我在07年在NetBeans 5.5上開發的一個圖像處理富客戶端應用,興奮之余又開始習慣性的反省,這2年在Platform開發上沒什么成績,要努力。



          posted @ 2009-12-11 21:12 陳維 閱讀(231) | 評論 (0)編輯 收藏

          JavaFX實現魚眼菜單 v0.1

          FisheyeMenu
          點擊圖片可運行程序

          posted @ 2009-12-06 02:27 陳維 閱讀(1843) | 評論 (3)編輯 收藏

          Inkscape提供將繪制保存為JavaFX的支持

          Inkscape是一個基于標準的SVG文件格式的開源矢量圖編輯器,在最新的0.47版本里添加了將繪制保存為JavaFX的支持。
          它將所有的繪制保存在一個繼承自CustomNode的JavaFX源文件里,目前只支持保存JavaFX源文件(.fx),不支持FXZ,不支持動畫。(可能以后也不會支持動畫,畢竟不是專注JavaFX的設計工具

          posted @ 2009-12-03 19:39 陳維 閱讀(1063) | 評論 (0)編輯 收藏

          使用JavaFX時間軸(Timeline)編寫的等待動畫



          (點擊圖片運行程序)

          項目源代碼下載:
          http://www.aygfsteel.com/Files/chenweionline/WaitingPaneFX.rar

          posted @ 2009-10-19 21:39 陳維 閱讀(3190) | 評論 (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 陳維 閱讀(1386) | 評論 (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 陳維 閱讀(180) | 評論 (0)編輯 收藏

          使用文件模板和向導創建一個類型文件

               摘要: 通過工具創建類型文件時通常會使用到各式各樣的模板,例如IDE在創建java文件時會自動在文件頭添加作者和創建日期的注釋、XML文件會自動添加根元素的標簽等。在NetBeans里通過使用文件模板可以很方便的按照既定的模式創建你的類型文件。 我在《創建新的文件類型 》里介紹了怎樣創建一個自定義的文件類型,創建后的文件類型里就包含了一個名為MapTemplate.xmap的空文件模板。現在我們將...  閱讀全文

          posted @ 2009-09-14 20:45 陳維 閱讀(586) | 評論 (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 陳維 閱讀(911) | 評論 (0)編輯 收藏

          創建NetBeans模塊項目

          學習NetBeans模塊開發首先需要做的就是創建一個NetBenas的模塊項目,使用NetNeans IDE提供的新建項目向導只需要經過4個步驟就可以新建一個模塊項目。

          1、首先IDE菜單中的新建項目創建一個新項目,在向導對話框中的項目類別選擇“NetBeans 模塊”,項目選擇“模塊”。



          2、下一步填寫項目名稱和項目所在的磁盤位置。我將項目命名為“MapCore”。



          3、接下來填寫代碼名稱基和模塊顯示名稱。項目名稱基的作用類似于Java類的包名,用來標識一個NB模塊。模塊顯示名稱顧名思義模塊用于顯示的名字。


          4、點擊“完成”按鈕結束MapCore模塊的創建,創建后的項目文件結構如下:


          posted @ 2009-09-14 20:19 陳維 閱讀(302) | 評論 (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 陳維 閱讀(127) | 評論 (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 陳維 閱讀(189) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 嘉祥县| 唐山市| 包头市| 女性| 武宣县| 崇州市| 许昌县| 湘阴县| 仁化县| 新平| 普洱| 玉门市| 色达县| 岳阳县| 江永县| 芦溪县| 额敏县| 都江堰市| 遂宁市| 永济市| 潼关县| 黄梅县| 邢台县| 堆龙德庆县| 凤山县| 房产| 荣成市| 普安县| 营山县| 维西| 泾川县| 双柏县| 武定县| 宁都县| 井冈山市| 无锡市| 扶余县| 包头市| 中宁县| 宜章县| 七台河市|