小蟲的天地

          Java SE | Java EE | NetBeans | Open Source World | Groovy | Grails | JavaScript | jQuery
          隨筆 - 10, 文章 - 0, 評論 - 225, 引用 - 0
          數據加載中……

          NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)

            上一篇博客介紹了NetBeans Java代碼編輯器,這一篇將介紹用NetBeans 開發基于Swing Application Framework (JSR 296) 的程序,Swing一直以來是飽受爭議的GUI庫,特別是SWT與Swing的爭論,分別體現在了Eclipse與NetBeans的爭論上。

          在此,我無心討論SWT與Swing孰優孰劣,你要是真的對這個感興趣,可以到williamchen博客里的Swing專欄看看,該專欄博主已經對SWT和Swing分析得非常透徹:

          http://blog.sina.com.cn/swingjava

          Swing在1998年末作為Java 2的一部分發布了1.0,但是當時發布的版本不管是性能還是外觀都足以令人失望。雖然當時Swing小組的工程師使用了最前沿的技術,如設計模式,但是時的Swing小組已經被性能、本地化外觀一致性問題以及許多錯誤深深陷住了,這些問題幾乎把整個項目拖垮。

          幸虧,Swing小組堅持了下來,要不然今天我們就不會看到像NetBeans這樣的IDE了。自從JDK1.5后,Java的性能已經有了巨大的改觀,現在1.6下,Swing的性能已經完全不是問題。

          那么Swing的優勢有那些呢?

          l         優秀的設計,正如剛才所說的,Swing從九十年代中期開始設計就用了當時最前沿的開發方法學。可以說Swing在當今各種GUI庫中,設計是非常優雅的。

          l         輕量級

          l         官方的存在JRE中,發布程序不需要像SWT那樣還要捆綁自己的GUI庫

          l         真正的平臺獨立,Swing組件由Java 2D繪制

          l         輕易的更改面觀模式

          l         強大的IDE支持,現在用NetBeans做界面,幾乎不用你敲一行代碼。

          l         Swing現在又多了一個殺手級框架Swing Application Framework (JSR 296)

          下面開始我的第二篇Java博客

          NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)

          Swing Application Framework簡介

          Swing Application Framework(以下簡稱SAF)致力于簡化Swing應用程序的開發,框架定義了對大多數桌面應用程序的共有的基礎設施:

          l         應用程序生命周期管理,特別是GUI的啟動和關閉。

          l         對資源管理和載入的支持,這些資源是字符串,格式化的消息,圖像,顏色,字體以及桌面應用程序共有的其他類型的資源。

          l         對動作定義,管理和綁定的支持,其中包含了異步運行的動作(在后臺運行)。

          l         持久化會話狀態:支持自動地,有選擇地保存應用程序一次運行到下次運行的GUI狀態。比如頂層的窗口幾何位置。


          用NetBeans開發SAF

          SAF已經定義了大多數桌面應用程序的基礎設施,我們可以更方便的開發Swing程序了,但是手動編碼開發GUI還是讓很多人抓狂。能不能提供一個像VB一樣的環境,讓程序員更加專注于功能的實現而不是界面的實現?答案是肯定的,NetBeans 6.0就為開發SAF提供了這樣一個環境,甚至比VB還要做得更好。

          那么到底NetBeans6.0SAF提供了什么樣的優勢呢?

          l         生成基礎框架,不必每次新創建一個程序的時候都從頭開始

          l         唾手可得的國際化支持,在Netbeans里對SAF程序國際化,簡單得不能再簡單

          l         擁有Swing世界里的明星級UI設計工具模塊Matisse提供的免費大餐

          l         NetBeans開發SAF,意味著你還可以使用Beans BindingJSR 295),數據綁定將問題變得更簡單



          開始之前

          用NetBeans 6.0開發基于SAF,其實不用明白SAF,主要遵循一定的開發原則也可以開發出穩定高效的SAF程序來

          但是為了你更深入的理解SAF,強烈建議看下面的文章

          l         Using the Swing Application Framework (JSR 296)

          http://java.sun.com/developer/technicalArticles/javase/swingappfr/

          l         Swing應用程序框架(Swing Application Framework)API緒論(JSR-296)之一

          http://www.javaeye.com/topic/81326

          Swing應用程序框架(Swing Application Framework)API緒論(JSR-296)之二

          http://www.javaeye.com/topic/81327

          l
             如果你有更多的時間,那么請看下面網址有關Swing的部分

          http://blog.sina.com.cn/swingjava



          開發環境準備

          JDK1.6或以上版本

          NetBeans6.0或以上版本

          提示:Netbeans 網站上提供有六種捆綁包下載

          l         Web & Java EE

          l         Mobility

          l         Java SE

          l         Ruby

          l         C/C++

          l         All

          開發Swing Application Framework只需要Java SE下載包就行了

          這樣能真正發揮NetBeans的性能!



          創建項目

          我們新建一個項目,從Java種類里選擇 Java Desktop Application,如下圖

          點擊下一步,接著輸入項目名稱、項目存放地址和程序的主類

          在Choose Application Shell里面我們選擇Basic Application,單擊完成

          提示:我們如果創建基于Swing的數據庫程序,那么選擇BataBase Application將提供極大的便利。但是在這里我只是介紹Basic Application,也就是現在我們用SAF開發普通的桌面程序。



          生成的項目目錄結構

          l         META-INF/services目錄

          該目錄一般存在一個JAR包里面

          META-INF/services目錄涉及一個模式:服務提供者模式

          引入該模式一般是為了程序松散耦合,而且是IoC(控制反轉)的另一種實現方式

          服務提供者模式一般有兩個角色

          ²        服務 :一般為一個抽象類

          ²        服務提供者 :抽象類的實現

          存在META-INF/services目錄的JAR包一般為一個“服務提供者”

          用NetBeans開發中小型程序不需要服務提供者概念,如果你要深入理解

          可以Baidu或Google一下META-INF/services

          l         foo

          foo包是我們創建程序的主類foo.FooApp時,NetBeans自動為我們生成的,

          我們來看看NetBeans為我們生成了什么基礎框架類:

          1、FooApp.java

          public class FooApp extends SingleFrameApplication {

              

          /**

               * 在啟動的時候創建和顯示程序的主框架

               
          */


              @Override 
          protected void startup() {

                  show(
          new FooView(this));

              }


              
          /**

               *這個方法是用相應的資源注入到特定的Window來初始化程序

               *因為我們用NetBeansk開發,所以相應的資源是通過Gui生成器來完成

               *也就是不用我們手動編寫代碼

               *所以這個方法不是必須的

               
          */


              @Override 
          protected void configureWindow(java.awt.Window root) {

              }


              
          /**

               * 一個方便的靜態獲取器,用來獲取FooApp類的實例

               
          */


              
          public static FooApp getApplication() {

                  
          return Application.getInstance(FooApp.class);

              }


              
          /**

               * 程序的運行入口點

               
          */


              
          public static void main(String[] args) {

                  launch(FooApp.
          class, args);

              }


          }

          FooApp.java里面的代碼是NetBean為我們生成的,開發簡單的程序這里基本上不需要更改什么。


          2
          、FooAboutBox.java

          每個程序都應該有一個關于界面,Netbeans為我們生成了關于的模板

          修改相應文字就可以了,當然也可以自己做個About界面


          3
          、FooView.java

          FooView.java是程序View部分的關鍵,由于生成的代碼比較多

          在解釋代碼之前,我先看看Design部分

          NetBenas給我們生成的框架非常簡單明了

          需要注意的是圖上標識的兩個地方

           標有1的地區為消息地區,我們的程序完成任務后,在這里提示消息

           標有2的地區為任務進度條,程序執行任務時在這里現實任務進度,當然任務有確定模式和不確定模式,不確定模式的進度條持續地顯示動畫來表示正進行的操作。

          接下來我們看看FooView.java的構造器的代碼:

              public FooView(SingleFrameApplication app) {

                  
          super(app);

                  initComponents();

                  ResourceMap resourceMap 
          = getResourceMap();

                  
          int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");

                  messageTimer 
          = new Timer(messageTimeout, new ActionListener() {

                      
          public void actionPerformed(ActionEvent e) {

                          statusMessageLabel.setText(
          "");

                      }


                  }
          );

                  messageTimer.setRepeats(
          false);

                  
          int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");

                  
          for (int i = 0; i < busyIcons.length; i++{

                      busyIcons[i] 
          = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");

                  }


                  busyIconTimer 
          = new Timer(busyAnimationRate, new ActionListener() {

                      
          public void actionPerformed(ActionEvent e) {

                          busyIconIndex 
          = (busyIconIndex + 1% busyIcons.length;

                          statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);

                      }


                  }
          );

                  idleIcon 
          = resourceMap.getIcon("StatusBar.idleIcon");

                  statusAnimationLabel.setIcon(idleIcon);

                  progressBar.setVisible(
          false);

                  
          // connecting action tasks to status bar via TaskMonitor

                  TaskMonitor taskMonitor 
          = new TaskMonitor(getApplication().getContext());

                  taskMonitor.addPropertyChangeListener(

                          
          new java.beans.PropertyChangeListener() {

                      
          public void propertyChange(java.beans.PropertyChangeEvent evt) {

                          String propertyName 
          = evt.getPropertyName();

                          
          if ("started".equals(propertyName)) {

                              
          if (!busyIconTimer.isRunning()) {

                                  statusAnimationLabel.setIcon(busyIcons[
          0]);

                                  busyIconIndex 
          = 0;

                                  busyIconTimer.start();

                              }


                              progressBar.setVisible(
          true);

                              progressBar.setIndeterminate(
          true);

                          }
           else if ("done".equals(propertyName)) {

                              busyIconTimer.stop();

                              statusAnimationLabel.setIcon(idleIcon);

                              progressBar.setVisible(
          false);

                              progressBar.setValue(
          0);

                          }
           else if ("message".equals(propertyName)) {

                              String text 
          = (String)(evt.getNewValue());

                              statusMessageLabel.setText((text 
          == null? "" : text);

                              messageTimer.restart();

                          }
           else if ("progress".equals(propertyName)) {

                              
          int value = (Integer)(evt.getNewValue());

                              progressBar.setVisible(
          true);

                              progressBar.setIndeterminate(
          false);

                              progressBar.setValue(value);

                          }


                      }


                  }
          );

          }

          一大段代碼,看起來是不是眼花繚亂啊,其實這么一大斷代碼是IDE給我們生成的用來初始發剛才所示的兩個區域的消息區和進度條區域的。

          也就是初始化消息區域和進度條區域,如果不想自定義消息現實和任務進度條的實現方式,上面一大段代碼大可不必理會。

          我們再來看一段代碼:

              @Action

              
          public void showAboutBox() {

                  
          if (aboutBox == null{

                      JFrame mainFrame 
          = FooApp.getApplication().getMainFrame();

                      aboutBox 
          = new FooAboutBox(mainFrame);

                      aboutBox.setLocationRelativeTo(mainFrame);

                  }


                  FooApp.getApplication().show(aboutBox);

          }

          看到方法名我們就知道,這個是用來實現關于界面的

          我們運行一下程序,在點擊菜單欄里面的 Help > About..

          結果,關于界面跳了出來。

          看到這里你也許會驚訝,因為按照傳統的方法,相應的菜單應該有相應的ActionListener事情監聽器才能發生事件啊!

          別著急,你看showAboutBox()方法前不是有一個注解: @Action

          這個注解涉及到SAF對動作的定義,我們后面將詳細講解

          l         foo.resources、foo.resources.busyicons包

          foo.resources、foo.resources.busyicons包是用來存放程序的圖像、文字等資源的地方

          后面講到程序的國際化的時候再作介紹。

           

           

          忘掉ActionListener事件監聽器,擁抱@Action

          上面我們已經提到,沒有相應的ActionListener事件監聽器點擊菜單欄里面的 Help > About..也照樣能觸發事件,這是怎么回事?

          原來是SAF框架對有@Action注釋的方法進行了管理。

          既然用原來的ActionListener已經處理得非常好,為什么SAF專家組的人還弄個@Action,這不是沒事找事干嗎?呵呵,下面我們通過幾個例子來說明引入@Action的好處

          l         制作環境相關的按鈕

          我們經常遇到這樣的按鈕或菜單,一般情況下它是不可用的,如上圖畫圈的三個按鈕,要等一定的條件他們自動啟用。

          我舉例用@Action做這樣的按鈕看看,不用擔心,不必寫多少代碼,IDE幫我們完成了大部分的工作

          我們要做的功能如下

          點擊選擇CheckBox選項后,按鈕自動開啟,取消選中后按鈕變灰色,不可用。

          在右邊的Palette屬性面板中拖出我們需要的兩個組件到程序主界面,并修改Text文字

          右鍵點擊按鈕,選擇 Set Action…

          在跳出來對話框中,在Action 選擇框中選中Create New Action

          接下填寫按鈕的相關信息,這里我做一下簡單的說明

          Action’s Class :動作方法存放在那個類中

          Action’s Method:動作方法的名稱,比如上面提到的跳出關于對話框的方法showAboutBox()

          Background Task選項:這個暫時不理它,后面將講到

          Attributes 1Basic標簽 設置按鈕的顯示文字、快捷鍵、按鈕圖像。

          2Advanced標簽可要注意了,因為這個和我們現在要做的例子關系非常大,我們在Advanced標簽里的Enabled Preproty 寫上 hasSelect(名字可以自己寫),如下面第二個圖

                      

           

          單擊OK,馬上看到IDE為我們生成的代碼

           

          這樣我們就可以通過setHasSelect()方法來設置按鈕的可用性,setHasSelect(ture) 時按鈕開啟,setHasSelect(false)時按鈕不可用。

          接下來選擇CheckBox組件,單擊右鍵,再選擇下圖所示

           

          出來代碼中寫上一行代碼:

           

          setHasSelect( ((JCheckBox)evt.getSource()).isSelected());

           

          最后是這樣子的

           

          private void jCheckBox1ItemStateChanged(java.awt.event.ItemEvent evt) {

              setHasSelect( ((JCheckBox)evt.getSource()).isSelected());

          }

           

          自此環境相關的按鈕就做完了,我們可以運行代碼試試。

          從上面的例子中我們看到,做這個例子真正只寫了一行代碼:

           

          setHasSelect( ((JCheckBox)evt.getSource()).isSelected());

           

          其它都是通過IDE生成的,多虧IDESAFAction我們才能如此高效的制作程序。

          l         菜單和按鈕關聯

          菜單和按鈕經常表現為同一個行為,我們當然可以各自實現它,但是這樣就產生了冗余

          編寫程序最總要的一點就是不要重復代碼。在Design模式下右鍵單擊相應的菜單,在Set Action…操作里面選擇相應Action

          這樣菜單和按鈕就關聯起來了,該菜單和按鈕行為相同,SAF如此簡單的為我們完成了任務。

          這又是Action解決了一大問題

          l         Background Task

          剛才在制作環境相關的按鈕時,我們忽略一個選項

          現在我們來介紹這個非常重要的特性

          以前人們不斷抱怨Swing是如何慢,其實JRE1.5后,特別是1.6后Swing性能已經完全不是問題,問題是開發Swing的程序員沒有處理好Swing的線程問題,比如本該在后臺運行的任務卻直接寫在Swing中,造成Swing程序相應緩慢。

          在以前你要非常熟練Swing和小心才能寫出高質量的Swing程序來,但是現在你利用SAF提供的框架支持,處理后臺任務變得非常容易。

          我們 Set Action 的時候把Background Task選項選中,最后看一下IDE給我們生成了什么代碼:

          原來的代碼:

              @Action(enabledProperty = "hasSelect")

              
          public Task actionMethodName() {

             }

          Background Task選項選中后為如下代碼:

              @Action(enabledProperty = "hasSelect")

              
          public Task actionMethodName() {

                  
          return new ActionMethodNameTask(getApplication());

              }


              
          private class ActionMethodNameTask extends 

                      org.jdesktop.application.Task
          <Object, Void> {

                  ActionMethodNameTask(org.jdesktop.application.Application app) 
          {

                      
          // Runs on the EDT. Copy GUI state that

                      
          // doInBackground() depends on from parameters

                      
          // to ActionMethodNameTask fields, here.

                      
          super(app);

                  }


                  @Override 
          protected Object doInBackground() {

                      
          // Your Task's code here. This method runs

                      
          // on a background thread, so don't reference

                      
          // the Swing GUI from here.

                      
          return null// return your result

                  }


                  @Override 
          protected void succeeded(Object result) {

                      
          // Runs on the EDT. Update the GUI based on

                      
          // the result computed by doInBackground().

                  }


          }

          可以看到,actionMethodName()方法里運行的代碼將在一個新線程中運行

          如果你要徹底明白上面的代碼和EDT是什么概念,請瀏覽下面的博客地址

          http://blog.sina.com.cn/swingjava中有關Swing部分。

          如果您懶得瀏覽,那么請遵循下面的建議

          1、在ActionMethodNameTask構造器中

          代碼運行在EDT(事件分派進程)中,在這里復制doInBackground() 方法中所需要的GUI 的狀態或參數到ActionMethodNameTask的成員變量中。

              2、doInBackground()方法中,不要存放處理GUI界面的代碼,該方法返回的值將自動傳到后面succeeded(Object Result)中

              3、succeeded()運行在EDT中,任務成功的執行后才執行該方法,該方法主要收集doInBackground()方法運行后的結果以用來更新GUI程序。

          我們做一下試驗,為ActionMethodNameTask增加一些代碼:

              private class ActionMethodNameTask extends 

                      org.jdesktop.application.Task
          <Object, Void> {

                  ActionMethodNameTask(org.jdesktop.application.Application app) 
          {

                      
          super(app);

                  }


                  @Override 
          protected Object doInBackground() {

                      
          for(int i=0;i<1000000;i++){

                          System.out.println(i);

                      }


                      
          return null

                  }


                  @Override 
          protected void succeeded(Object result) {

                      setMessage(
          "運行成功");

                  }


              }

          運行程序后點擊按鈕

          任務開始:


          任務結束:

          注意提示信息只顯示一定時間,這個時間可以自己設定,一定時間后信息自動消失。

          l         制作阻塞按鈕

          我經常要做具有阻塞功能的按鈕,比如我們按一下按鈕,就跳出如上對話框,程序在后臺運行任務,但是我們不能進行其它操作,除非我們點擊取消按鈕。

          制作這樣的按鈕,其實非常簡單:

          在Set Action...進行如下設置就可以了

           

          Blocking Type 可以選擇NONE,ACTION,COMPONENT,WINDOW,APPLICATION指定阻塞的范圍空間,你可以自己嘗試一下,效果是怎樣的。

          從上面幾個小例子可以看到引入@Action巨大好處了吧。



          國際化支持

          正如開始所說的,SAF本身就很好的支持了國際化,再加上NetBeans輔助,國際化簡直易如反掌。

          我們知道一些企業框架比如StructsJSF是通過后綴名為properties的文件保存相關資源的。

          SAF也是,我們看看IDE為我們生成的properties文件

          從上圖可以看出,

          FooApp.java

          FooAboutBox.java

          FooView.java

           

          這三個類在foo.resources包分別對應有后綴名為properties的文件

          FooApp. properties

          FooAboutBox. properties

          FooView. Properties

           

          也就是說,類里面用到文字資源,圖像資源集中放到了一起。這樣國際化就相當簡單了

          這時也許你會說,一開始就寫properties的文件,豈不是很麻煩?

          別忘了,我們NetBeans的支持,做這個工作幾乎不費你任何力氣

          在可視化編輯頁面,我直接修改相應文字,IDE會自動為我們把相應的文字保存到對應的properties的文件中。

          根本不用自己手動敲寫下面的文字

          jCheckBox1.text=選中按鈕開啟

           



          尾聲

          關于用NetBeans開發Swing Application Framework程序其實還有很多我沒有說清楚,有些也很難說清楚,關鍵還是要自己親身試驗一下,正如大牛們所說的“理論看不懂就去實踐,實踐不懂就去看理論”。

          本文僅起到入門介紹的作用。開發需要的SAF JavaDoc文檔可以下面所示查看:



          為了你更好的理解,我用
          SAF做一個端口掃描程序,這個程序很不完善,僅做演示:


          點擊這里下載源代碼:
          PortScan.rar
          (提示:NetBeans6.X打開項目目錄即可)



          SAF
          做的更完整的程序:

          l         mp3在線搜索工具


          你可以到作者博客查看更詳細信息:

          http://www.aygfsteel.com/huliqing/archive/2008/03/26/188817.html

          l         單詞Mp3隨身寶DIY


          本人的英語成績一直不是很好,特別是詞匯量很低
          ,很多單詞不會發音。

          所以我就有個想法,能不能把自己想要背記的單詞做成MP3的形式,單詞和單詞的解釋放到對應.lrc文件中,隨意挑選單詞,

          制作成帶同步歌詞(LRC文件)的MP3文件,這樣在MP3機上就能邊聽單詞邊同步看單詞及其解釋,單詞先后次序、間隔多長,

          可以相應自由地調整,讓我們的MP3機變成英語學習機!我通過網絡尋找這樣的軟件。

          但是找了好久就是找不到合適的軟件,只是有一個《我愛背單詞》的軟件有類似這樣的一個功能,但是該軟件是閉源收費軟件,

          免費版的語音是合成的,效果非常差。求人不如求自己,于是產生制作這個程序的想法。

          這個程序原本就是想開源的,但是我拿去參加學校的電腦作品賽了,比賽的作品先前不能發布。所以暫時不發布程序和源代碼,等比賽結束再上傳程序和源代碼。這個可能要一段時間,請大家耐心等待消息。

          l         NetBeans開發但是沒有用SAFYOYOPlayerMp3播放器


          詳細信息請看作者的博客:

          http://www.aygfsteel.com/hadeslee/archive/2007/12/31/171678.html

          通過上面幾個程序可以體現出NetBeans的強大特性來(不僅僅是做桌面程序哦)!SAF框架加上NetBeans,我們可以專注程序的功能而不是程序的基礎實施上,而且即使是初學者也可以編寫出高性能的Swing程序來。我相信隨著越來越多的人了解SAFNetBeans,后面會不斷涌現出新的Swing桌面程序來,讓我們拭目以待吧!

          由于水平有限,文中有些術語解釋可能不準確,歡迎批評指正!(這也是我寫博客的原因,通過他人認識自己的不足)

          版權聲明:

          本文由令狐蟲原創,歡迎轉載,轉載請保留博客地址:

          http://www.aygfsteel.com/linghuchong/

          posted on 2008-03-27 11:05 令狐蟲@qq.com 閱讀(10643) 評論(44)  編輯  收藏 所屬分類: NetBeans

          評論

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          又看到了博主的新聞章,很是受用,加油啊博主!我現在正在學習java的swing編程,希望有機會和博主交流交流!
          2008-03-27 11:15 | 日月雨林

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          呵呵,大家共同學習進步!~
          2008-03-27 11:20 | 令狐蟲

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          博主對Netbeans的了解,值得學習,我現在也在用NetBeans學習java,希望有機會能和博主 交流交流!
          2008-03-27 12:14 | 日月雨林

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          很不錯的文章,我也是想學習Swing,但是現在工作太忙,只能晚上加班回家搞半個小時,對著Netbeans一頓狂托....

          希望樓主將這個寫成一個序列,介紹如何使用NetBeans開發Swing程序.
          2008-03-27 13:16 | hcom

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          嗯,的確netbeans 開發swing 不錯,可惜還有些問題,比如:
          1。netbeans自動生成的代碼無法修改
          2。弄好的界面下次打開的時候,有時候控件會縮成一條,無法再次拖拉修改

          雖然總會有些問題,但不能掩飾俺對netbeans的喜歡
          2008-03-27 14:07 | fatbear

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @日月雨林
          隨時歡迎交流

          @hcom
          如果有時間的話,我正打算這么做

          @fatbear
          其實你那兩個問題都不是問題
          只是大家對NetBeans不夠了解而已
          NetBeans強大卻不失靈活
          下一篇文章我打算對你這兩個問題做個介紹。
          2008-03-27 14:17 | 令狐蟲

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @令狐蟲
          netbeans剛用不久,期待你的下一篇文章

          2008-03-27 17:29 | fatbear

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          很不錯,今年一定研究一下:)
          2008-03-27 17:42 | Masen

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          博主的文章很不錯哦!
          eclipse與netbeans這兩個工具我都有用過段時間,因為喜歡上JSF后我才使用netbeans,在netbeans5.5的時候還是有些不適應,而且還有不少bug,所以一直追蹤著netbeans的版本更新, 現在感覺使用netbeans已經非常順手舒服。當然eclipse也非常不錯,但我還是比較喜歡netbeans的便利,不喜歡到處去找插件。
          2008-03-27 19:07 | huliqing

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          是呀 感謝分享 以后看來可視化和基于標注開發是大勢所趨啊 Eclipse RCP 這方面遠遠落后
          2008-03-27 22:02 | BeanSoft

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          支持java,支持swing
          2008-03-28 00:12 | zht

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          樓主的文章給了我很大的幫助,期待你以后的文章。
          2008-05-08 09:51 | writegull

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          我跟著lz的教程進步中。。。寫一篇我學一篇。
          2008-05-11 11:55 | bk

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          6.1版本突然沒有了“Set Action”菜單了,奇怪ing
          2008-05-21 12:08 | bk

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          弄錯了,只有在DesktopApplication程序中才有這個。java Application為什么沒有呢?奇怪
          2008-05-21 12:16 | bk

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          您好,想請教您一個問題

          用netbeansRCP生成的程序,標題欄的咖啡圖標要怎么改掉?

          我在窗口類的構造器里面試著加了
          ImageIcon image = new ImageIcon("icon.ico");
          this.getFrame().setIconImage(image.getImage());

          this.getFrame().setIconImage((Toolkit.getDefaultToolkit().createImage("icon.ico")));

          都沒辦法改掉那個咖啡圖標
          2008-05-29 10:26 | fcy

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @zht
          @writegull
          @bk
          感謝各位的支持!
          最近由于時間忙,抽不出時間來寫新教程,等忙過這段時間后
          我將陸續的介紹NetBeans其它方面的內容!

          @fcy
          我以前軟件工程的課程設計就是用NetBeans RCP做的
          那時標題欄不是你所說的咖啡圖標,而是方塊圖標
          不知道現在是不是改為你所說的咖啡圖標

          不過要修改這個圖標很簡單
          有兩種方法
          方法一:
          修改套件的的 Improtant Files->Project Properties文件
          app.icon=圖片地址(類路徑地址)

          方法二:
          右鍵點擊套件選擇Properties
          在Build選項里面選擇你自己的圖標地址
          NetBeans會自動把這個圖標保存到branding/core/core.jar/org/netbeans/core/startup/里面
          不用手動修改
          2008-05-29 13:04 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          剛才試了下,以上兩種方法,當新建的項目為NetBeans Modules時才可以使用(標題欄上的圖標的確是方塊圖標)


          新建Java Desktop Application(就是按文章上說的基于SAF,這時候標題欄上就是咖啡圖標了),就沒辦法使用上面說的2種辦法了..還有其它的辦法可以更改標題欄上的圖標嗎?
          2008-05-29 15:42 | fcy

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @fcy
          原來你是說用基于SAF的圖標啊

          你可以試一下在窗口類的構造器寫下面這樣的代碼:
          getFrame().setIconImage(new ImageIcon(getClass().getResource("地址")).getImage());

          地址的形式如下:
          /desktopapplication/resources/ico.png
          ico.png存放在desktopapplication.resources包中
          2008-05-29 17:26 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @令狐蟲@qq.com

          使用this.getFrame().setIconImage(new ImageIcon(getClass().getResource("resources/icon.png")).getImage());
          可以改標題欄圖標了^_^

          謝謝了^_^


          ImageIcon image = new ImageIcon("resources/icon.png");
          this.getFrame().setIconImage(image.getImage());
          我原來用上面這種寫法怎么就改不了呢?一個功能啊?


          2008-05-29 23:32 | fcy

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @fcy
          只是ImageIcon的構造參數不一樣而已
          getClass().getResource("resources/icon.png")獲取的是resources/icon.png的類路徑URL,一般圖片放在JAR包里面
          都應該用這種方法



          2008-05-30 09:17 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          原來是這樣...明白了..謝謝了^_^
          2008-05-30 14:30 | fcy

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          不知道博主有沒有碰到下面的問題
          http://www.javaeye.com/problems/370
          請看鏈接內容
          2008-06-07 15:16 | pp21

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @pp21
          很抱歉,你遇到的情況我沒有遇到過!
          你的問題也沒有說清楚,我沒有辦法去試驗!
          2008-06-07 22:00 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          當你寫過幾個SWING 的應用程序,會發現matisse 純屬意淫。


          2008-06-18 11:55 | 管華

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          這個玩意只能用來教學,給學生演示,學生看完之后會肯定會說:好強大。

          他的致命缺點是生成的代碼不能改,每個UI類會有個form文件,netbeans加載時首先打開的form文件,這個文件是XML格式的,本身也是天書,就算你把代碼改了,netbeans同樣會以XML文件里面的信息為主再把代碼更新。

          不改的代碼是可能的,往往界面有很多自定義的控件,包括日歷,一些自己業務上的component,比如某個設備樹等等。

          不可否認就像SUN自己的說的的一樣,MATTISSE是當前世界上無與倫比的可視化拖拽工具,也僅此而已。

          2008-06-18 12:06 | 管華

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @管華
          呵呵!這位兄弟對MATTISSE有很大的意見啊
          Swing Application Framework (JSR 296) 本來就是針對中小型程序的
          我相信沒有人會用Swing Application Framework開發大型軟件的吧?
          對于學生的課程設計、需要快速開發的中小軟件,Swing Application Framework (JSR 296)完全可以勝任
          對于開發超大型的Swing程序NetBeans RCP也完全可以勝任,在NetBeans RCP中,用MATTISSE也可以加速開發嘛。
          至于代碼不能改的問題,NetBeans還是提供修改的可能的。^_^

          不過令人欣慰的是,在這個流行B/S模式的時代,還有人關心Swing。
          2008-06-19 22:12 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          “this.getFrame().setIconImage(new ImageIcon(getClass().getResource("resources/icon.png")).getImage());”

          可用! 非常感謝——令狐蟲@qq.com 和fcy !!!
          2008-07-21 15:27 | syslover

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          呵呵,一點意見而已。

          我不搞SWING已經好多年
          2008-08-05 17:47 | 管華

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          如何修改代碼呢?
          2008-08-10 20:18 | yanjc

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          樓主是人才
          2008-08-18 13:56 | 1

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          你好!對你的作品試用過,也學習了.作為一個JAVA忠實的學習者,你的設計使我深受鼓舞.看到大家都這么熱情的提問,在這里我也有一個小的想法.就是給界面上加一個"打開文件"這樣的功能.這也是我作為一個體驗者第一次運行程序所想到的.希望你的程序功能更加完善.謝謝!

          (我真誠地希望與更多JAVA愛好者共同學習交流.QQ:719378618)
          2008-10-15 10:03 | JAVA學習者

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @JAVA學習者
          很高興自己的作品能被別人關注,你的想法也很好!
          有時間我會完善并且做一些新java桌面程序!
          2008-10-15 11:14 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          我就想要那個背單詞的阿!看起來很有用!
          2008-11-11 10:03 | 泥巴麒麟

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @泥巴麒麟
          源代碼已經發在Subversion服務器上了
          你可以再下面的地址檢出代碼:
          svn://svnhost.cn/DictMp3ComposeApp
          2008-11-11 10:48 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          樓主,

          文章中是不是還有錯誤阿?呵呵,以下是疑問

          原文有:
          從上面的例子中我們看到,做這個例子真正只寫了一行代碼:
          setHasSelect( ((JCheckBox)evt.getSource()).isSelected());

          是不是在setHasSelect(boolean b)里面還少了一行代碼
          jButton1.setEnabled(b);
          2009-04-19 01:27 | daan

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          原來上面看錯了。。。。
          2009-04-19 11:59 | daan

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @管華
          右擊控件-》定制代碼
          基本上可定制的地方夠用了。
          自定義控件有個布局上的小BUG,因為自動生成代碼的流程是:
          初始化
          設置布局
          而自定義的組件在創建的時候就布局了,結果是布局被覆蓋掉。
          實際上設置布局的自動代碼只要先判斷一下panel有沒有布局管理器就能避免這個BUG。希望下個版本能解決這個問題。
          現在只要把自定義組件的布局放在父窗口布局后就可以了。
          2009-04-23 12:18 | sleepsaint

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          您好,您的mymusic源碼不知道怎么的,是空的,下不下來,請您加我qq254905352幫我傳一份,謝謝!
          2009-04-29 11:52 | 傷心太平洋

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)[未登錄]  回復  更多評論   

          很好很強大。
          @Action出來的標簽不能決定何時Action可見,只有enable, selected屬性,郁悶中。。。。
          2009-05-18 16:08 | steeven

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          請問樓主阻塞功能的按鈕中間的pregressbar裡頭的文字是亂碼.有修正的方法嗎?
          2010-05-03 16:09 | oreio

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          @oreio

          假設@Action Task actionMethodName()
          那在
          foo.resources包中FooView. Properties中
          增加下面一行可以去掉亂碼文字

          actionMethodName.BlockingDialog.progressBar.stringPainted=false
          2010-05-04 00:48 | 令狐蟲@qq.com

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          寫得相當的贊!!
          2010-05-07 19:32 | leeing

          # re: NetBeans 6.0 提高生產力之Swing Application Framework (JSR 296)  回復  更多評論   

          SAF是很不錯,希望 Java 在 Oracle 手里能持續發展,別受 JAVA 7 影響
          2010-05-16 21:47 | kinzey
          主站蜘蛛池模板: 东乌珠穆沁旗| 延安市| 中江县| 平罗县| 礼泉县| 静海县| 常德市| 富川| 方正县| 南靖县| 吴桥县| 宜兴市| 寿阳县| 木里| 修文县| 福建省| 陵水| 七台河市| 巴彦淖尔市| 浏阳市| 通化市| 惠来县| 诸暨市| 平乐县| 垣曲县| 兰溪市| 西华县| 宁强县| 漠河县| 宿州市| 沙坪坝区| 通化县| 富阳市| 江西省| 天柱县| 古田县| 黎川县| 娄烦县| 华亭县| 武定县| 桐梓县|