網(wǎng)路冷眼@BlogJava

          熙熙攘攘一閑人 以冷靜的眼光觀(guān)察技術(shù)
          posts - 88, comments - 193, trackbacks - 0, articles - 28
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          概述

          本文檔是原型Swing應(yīng)用程序框架的簡(jiǎn)介,目標(biāo)讀者是那些愿意評(píng)論初始原型的的開(kāi)發(fā)者。它既不是綜合的教程,也不是開(kāi)發(fā)者指南,它只是通過(guò)示例引入框架主要特性的概觀(guān)。在檢查規(guī)格說(shuō)明(javadoc)和實(shí)現(xiàn)之前,閱讀本材料是明智之舉。

          目標(biāo)

          本API的目標(biāo)是由原始的Java規(guī)格請(qǐng)求(JSR) JSR-296所定義, 它在2006年5月批準(zhǔn)。 其整體目標(biāo)是簡(jiǎn)化構(gòu)建Swing應(yīng)用程序,讓桌面Java開(kāi)發(fā)人員對(duì)此的工作也是直截了當(dāng)?shù)摹Mㄟ^(guò)提供一小組類(lèi),也叫“框架”來(lái)達(dá)到此目標(biāo)。框架定義了對(duì)大多數(shù)桌面應(yīng)用程序的共有的基礎(chǔ)設(shè)施:

          • 應(yīng)用程序生命周期管理,特別是GUI的啟動(dòng)和關(guān)閉。
          • 對(duì)資源管理和載入的支持,這些資源是字符串,格式化的消息,圖像,顏色,字體以及桌面應(yīng)用程序共有的其他類(lèi)型的資源。
          • 對(duì)動(dòng)作定義,管理和綁定的支持,其中包含了異步運(yùn)行的動(dòng)作(在后臺(tái)運(yùn)行)。
          • 持久化會(huì)話(huà)狀態(tài):支持自動(dòng)地,有選擇地保存應(yīng)用程序一次運(yùn)行到下次運(yùn)行的GUI狀態(tài),比如頂層的窗口幾何位置。

          框架API概述

          框架應(yīng)用程序建立Application基類(lèi)的子類(lèi),它定義了應(yīng)用程序的生命周期,特別是應(yīng)用程序的啟動(dòng)時(shí)所為,關(guān)閉時(shí)所為。當(dāng)應(yīng)用程序啟動(dòng)時(shí),建立這個(gè)子類(lèi)的單個(gè)實(shí)例。ApplicationContext 單體支持Application類(lèi)的子類(lèi)。它提供對(duì)動(dòng)作,資源,任務(wù),對(duì)話(huà)狀態(tài)和存儲(chǔ),其它對(duì)象和服務(wù)的訪(fǎng)問(wèn)。它對(duì)應(yīng)用程序來(lái)說(shuō)是全局的。框架的整體結(jié)構(gòu)可根據(jù)這兩個(gè)單體來(lái)描述.

           

          SR-296架構(gòu):應(yīng)用程序(Application),ApplicationContext 單體模式

          免責(zé)聲明

          這是初稿。在許多方面未完成,并且這里所述的API的確在演進(jìn)當(dāng)中。它打算為那些對(duì)框架API當(dāng)前狀態(tài)好奇并能容忍其瑕疵的開(kāi)發(fā)人員所作。我希望它將激發(fā)那種讓代碼和文檔下次修訂更好的建設(shè)性反饋來(lái)。

          應(yīng)用程序框架示例

          對(duì)開(kāi)發(fā)者來(lái)說(shuō),熟悉新的API最容易的方法是通過(guò)學(xué)習(xí)幾個(gè)示例。本節(jié)提供一系列示例增量式地展示許多API最為重要的方面。每個(gè)示例的源代碼可在示例包中找到。

          下面的示例節(jié)包含類(lèi)它們依賴(lài)的框架類(lèi)的簡(jiǎn)單梗概。要獲得更完整的解釋?zhuān)?qǐng)參見(jiàn)下面主要章節(jié),或者查詢(xún)javadoc規(guī)范。

          基于Hello World的Application

          為了編寫(xiě)應(yīng)用程序,只需要做幾件事情:

          • 擴(kuò)展Application 類(lèi)并覆蓋startup方法。 startup方法應(yīng)當(dāng)建立和顯示應(yīng)用程序初始的GUI。
          • 當(dāng)應(yīng)用程序退出時(shí),當(dāng)用戶(hù)關(guān)閉最頂層的窗口時(shí),調(diào)用Application.exit()。這將導(dǎo)致應(yīng)用程序讓exitListeners運(yùn)行并最終運(yùn)行Application.shudown().
          • 在main方法里,調(diào)用Application.launch方法。這將構(gòu)建并啟動(dòng)在事件分派線(xiàn)程上的Application子類(lèi)。

          下列示例正是這樣做的。實(shí)際上基于SingleFrameApplication類(lèi)這種應(yīng)用程序非常簡(jiǎn)單,因?yàn)樗幚響?yīng)用程序JFrame的構(gòu)建和配置。但是本例這個(gè)版本應(yīng)當(dāng)使得在SingleFrameApplication 類(lèi)里的“鉤子下面(under the hood)”發(fā)生的事情更加明了。

           

          public class ApplicationExample1 extends Application {
              JFrame mainFrame 
          = null;
              @Override 
          protected void startup(String[] ignoreArgs) {
                  JLabel label 
          = new JLabel("Hello World", JLabel.CENTER);
                  label.setFont(
          new Font("LucidaSans", Font.PLAIN, 32));
                  mainFrame 
          = new JFrame(" Hello World ");
                  mainFrame.add(label, BorderLayout.CENTER);
                  mainFrame.addWindowListener(
          new MainFrameListener());
                  mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                  mainFrame.pack();
                  mainFrame.setLocationRelativeTo(
          null);  // center the window
                  mainFrame.setVisible(true);
              }
              
          private class MainFrameListener extends WindowAdapter {
                  
          public void windowClosing(WindowEvent e) {
                      exit(e);
                  }
              }
              
          public static void main(String[] args) {
                  launch(ApplicationExample1.
          class, args);
              }
          }
              

           

          如果運(yùn)行ApplicationExample1,結(jié)果如下:

          ApplicationExample1 (Hello World) 屏幕截圖

          在此仍然存在許多(JFrame)樣板,因?yàn)閼?yīng)用程序基類(lèi)不能假定應(yīng)用程序到底構(gòu)建GUI的數(shù)量。下一個(gè)示例顯示了通過(guò)使用一個(gè)擴(kuò)展Application 叫做SingleFrameApplication的類(lèi),如何更簡(jiǎn)單地完成相同的工作。

          基于Hello World的SingleFrameApplication

          為了建立只有一個(gè)主JFrame的應(yīng)用程序,只要擴(kuò)展SingleFrameApplication類(lèi)即可。應(yīng)用程序的子類(lèi)應(yīng)當(dāng)覆蓋建立應(yīng)用程序的主GUI面板的startup方法,然后建立,配置和顯示包含這個(gè)面板的JFrame。

           

          public class SingleFrameExample1 extends SingleFrameApplication {
              
          public void startup(String[] args) {
                  JLabel label 
          = new JLabel(" Hello World ");
                  label.setFont(
          new Font("LucidaSans", Font.PLAIN, 32));
                  show(label);
              }
              
          public static void main(String[] args) {
                  launch(SingleFrameExample1.
          class, args);
              }
          }
              

           

          盡管本例和前面的例子完全一致,但是建立和配置主JFrame的樣本文件是由SingleFrameApplication.show 方法處理的。SingleFrameApplication也負(fù)責(zé)打點(diǎn)一些其它的公共的生命周期雜務(wù),比如載入資源和保存/恢復(fù)對(duì)話(huà)狀態(tài)。

          帶有資源的SingleFrameApplication

          在前面示例中,建立了帶有文字字符串的JLable。由用戶(hù)讀取的字符串應(yīng)當(dāng)本地化。為了完成本地化,字符串應(yīng)當(dāng)從ResourceBundle載入。應(yīng)用程序框架支持自動(dòng)初始化從ResourceBundle資源載入的有名組件的特性。對(duì)“資源注入(resource injection)”的支持超出了字符串的范疇;數(shù)值的初始值,顏色,字體和大多數(shù)其它的公共桌面GUI類(lèi)型都能夠用資源來(lái)定義。

          這里是前面例子的新版本。本例除了設(shè)置它的名稱(chēng)之外,對(duì)JLabel沒(méi)作任何配置:

          public class SingleFrameExample2 extends SingleFrameApplication {
              
          public void startup(String[] args) {
                  JLabel label 
          = new JLabel();
                  label.setName(
          "label");
                  show(label);
              }
              
          public static void main(String[] args) {
                  launch(SingleFrameExample2.
          class, args);
              }
          }

           
          SingleFrameExample2的ResourceBundle是以相同名字的特性文件,它駐留在資源子包里。文件中的資源定義了一個(gè)名叫"label"組件的初始值:

          label.opaque = true
          label.background = 0, 0, 0
          label.foreground = 255, 255, 255
          label.text = Hello World
          label.font = Lucida-PLAIN-48
          label.icon = earth.png

          本例簡(jiǎn)單演示了配置從ResourceBundle的組件。在實(shí)際應(yīng)用程序里,將使用很可能需要本地化的值的資源,有時(shí)是諸如顏色、字體那些和本地化值緊密相關(guān)的特性。通過(guò)用資源而不是用代碼定義,隔離依賴(lài)于像圖像文件之類(lèi)的外部對(duì)象的組件特性也是有用的。這使得開(kāi)發(fā)者比較容易理解應(yīng)用程序外部資源依賴(lài)是什么,并能簡(jiǎn)化對(duì)系統(tǒng)的變化的處理。

          如果運(yùn)行SingleFrameExample2,那么其效果如下:

          SingleFrameExample2 (Hello World) 屏幕截圖

           

          SingleFrameApplication.show方法使用ResourceMap的injectComponents方法初始化從應(yīng)用程序的ResourceBundle載入的每個(gè)有名組件的特性。

          退出應(yīng)用程序

          通過(guò)調(diào)用Applcaiton.exit方法,應(yīng)用程序應(yīng)當(dāng)能順利退出。當(dāng)關(guān)閉主JFrame時(shí),SingleFrameApplication的職責(zé)所在。在實(shí)際的應(yīng)用程序里,確保用戶(hù)在關(guān)閉是真的希望退出經(jīng)常是重要的。例如,可能希望詢(xún)問(wèn)未保存的文檔或者未完成的事務(wù)處理。在exit()真的終止應(yīng)用程序之前,通過(guò)調(diào)用canExit方法輪詢(xún)所有的exitListener。如果任何一個(gè)canExit方法返回false,退出過(guò)程將終止。否則,調(diào)用exitListener的willExit方法,并最終調(diào)用Appliciton 的shutdown方法。這些方法正是打理任何清掃工作的地方。

          本例在下面正是用一個(gè)對(duì)話(huà)來(lái)詢(xún)問(wèn)用戶(hù)確認(rèn)退出的。

           

          public class SingleFrameExample3 extends SingleFrameApplication {
              
          public void startup(String[] args) {
                  ExitListener maybeExit 
          = new ExitListener() {
                      
          public boolean canExit(EventObject e) {
                          
          int option = JOptionPane.showConfirmDialog(null"Really Exit?");
                          
          return option == JOptionPane.YES_OPTION;
                      }
                      
          public void willExit(EventObject e) { }
                  };
                  addExitListener(maybeExit);
                  JButton button 
          = new JButton();
                  button.setName(
          "button");
                  button.setAction(
          new ActionAdapter() {
                          
          public void actionPerformed(ActionEvent e) {
                              exit(e);
                          }
                      });
                  show(button);
              }
              
          public static void main(String[] args) {
                  launch(SingleFrameExample3.
          class, args);
              }
          }

          本例的ResourceBundle和前面相似,既然這樣還是配置了這個(gè)JButton。也增加了一個(gè)定義主JFrame的標(biāo)題的資源。SingleFrameApplication命名它建立的JFrame為"mainFrame"。

          mainFrame.title = ExitListener Demo
          button.background = 255, 255, 255
          button.foreground = 0, 0, 0
          button.text = Click to Exit
          button.font = Lucida-PLAIN-48
          button.icon = exit.png

          如果運(yùn)行SingleFrameExample3,單擊窗口的關(guān)閉按鈕或者按下巨大的“Click to Exit”按鈕嘗試退出時(shí),將提示操作者確認(rèn):

          SingleFrameExample3 屏幕截圖

          在本例里,使用建立一個(gè)實(shí)現(xiàn)了javax.swing.Action的匿名類(lèi)的實(shí)例的常規(guī)方法來(lái)設(shè)置按鈕的動(dòng)作特性。動(dòng)作對(duì)象的actionPerformed方法只是調(diào)用exit。應(yīng)用程序框架則通過(guò)使用新的@Action標(biāo)注從而建立動(dòng)作對(duì)象的建立。

          (待續(xù),請(qǐng)參見(jiàn):Swing應(yīng)用程序框架(Swing Application Framework)API緒論(JSR-296)之二(翻譯))


          評(píng)論

          # re: Swing應(yīng)用程序框架(Swing Application Framework)API緒論(JSR-296)之一(翻譯)  回復(fù)  更多評(píng)論   

          2007-05-22 23:55 by 熱門(mén)單曲
          有才樓主 路頂下

          # re: Swing應(yīng)用程序框架(Swing Application Framework)API緒論(JSR-296)之一(翻譯)  回復(fù)  更多評(píng)論   

          2008-12-22 13:17 by eydp@163.com
          SingleFrameExample3 ----這個(gè)例子中內(nèi)部?jī)?nèi)這個(gè)地方總報(bào)錯(cuò)
          button.setAction(new ActionAdapter() {
          public void actionPerformed(ActionEvent e) {
          exit(e);
          }
          });

          # re: Swing應(yīng)用程序框架(Swing Application Framework)API緒論(JSR-296)之一(翻譯)  回復(fù)  更多評(píng)論   

          2008-12-24 18:09 by lewhwa
          @eydp@163.com
          這個(gè)語(yǔ)句要退出程序,不會(huì)報(bào)錯(cuò)的。
          主站蜘蛛池模板: 江津市| 莎车县| 青冈县| 贵南县| 桐梓县| 平邑县| 伊通| 溧水县| 彭山县| 收藏| 宁河县| 商水县| 措美县| 桓仁| 综艺| 特克斯县| 交城县| 连南| 读书| 新疆| 阿鲁科尔沁旗| 贞丰县| 连州市| 共和县| 武鸣县| 广昌县| 清苑县| 武乡县| 乌拉特后旗| 民县| 五家渠市| 荆州市| 安康市| 龙井市| 西充县| 通辽市| 萍乡市| 湘西| 西青区| 安平县| 农安县|