qiyadeng

          專注于Java示例及教程
          posts - 84, comments - 152, trackbacks - 0, articles - 34

          IBM推薦的的開發組合.

          http://www-128.ibm.com/developerworks/cn/kickstart/index.html

          posted @ 2006-04-04 09:16 qiyadeng 閱讀(805) | 評論 (1)編輯 收藏

          網上主要流傳有兩種方式實現系統托盤:
          1.Windows Tray Icon (http://jeans.studentenweb.org/java/trayicon/trayicon.html)
          shot-balloon.gif

          2.SysTray for Java (http://systray.sourceforge.net/)
          shot.png

          這兩個都是開源的...可以根據上面的下載.

          相對來說,我更喜歡SysTray for Java,原因很簡單,SysTray for Java實現了我所要的功能而且相對來說比Windows Tray Icon 要簡單.

          使用SysTray是很簡單的.下載下來的文件有個例子Example.java,照著這個實現你所需要的功能應該不算困難.

          主要是菜單和按鈕的操作,和操作一般的JFrame一樣.

          下面是一個例子程序:

          package qiya.systray;

          import java.awt.Dimension;
          import java.awt.Font;
          import java.awt.Rectangle;
          import java.awt.Toolkit;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;

          import javax.swing.ImageIcon;
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JLabel;
          import javax.swing.JOptionPane;
          import javax.swing.UIManager;
          import javax.swing.UnsupportedLookAndFeelException;

          import snoozesoft.systray4j.SysTrayMenu;
          import snoozesoft.systray4j.SysTrayMenuEvent;
          import snoozesoft.systray4j.SysTrayMenuIcon;
          import snoozesoft.systray4j.SysTrayMenuItem;
          import snoozesoft.systray4j.SysTrayMenuListener;

          public class MainFrame extends JFrame implements ActionListener,
          ??SysTrayMenuListener {

          ?static final int INIT_WIDTH = 400;// 默認窗口寬度

          ?static final int INIT_HEIGHT = 244;// 默認窗口高度

          ?private static final String toolTip = "寬帶計費接口";// 提示文字

          ?static final SysTrayMenuIcon icon = new SysTrayMenuIcon("rocket.gif");// 圖片信息

          ?SysTrayMenu menu;// 菜單

          ?private JButton launchButton = new JButton();// 啟動按鈕

          ?private JButton exitButton = new JButton();// 退出按鈕

          ?private JLabel statusLabel = new JLabel();// 運行狀態

          ?public static void main(String[] args) {
          ??try {
          ???UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
          ??} catch (ClassNotFoundException e) {
          ???e.printStackTrace();
          ??} catch (InstantiationException e) {
          ???e.printStackTrace();
          ??} catch (IllegalAccessException e) {
          ???e.printStackTrace();
          ??} catch (UnsupportedLookAndFeelException e) {
          ???e.printStackTrace();
          ??}

          ??new MainFrame();
          ?}

          ?public MainFrame() {
          ??super("寬帶計費接口");// 標題
          ??setIconImage(new ImageIcon(getClass().getResource("rocket.gif"))
          ????.getImage());// 圖標
          ??this.setLayout(null);
          ??this.setSize(new Dimension(INIT_WIDTH, INIT_HEIGHT));
          ??Dimension dimScreen = Toolkit.getDefaultToolkit().getScreenSize();
          ??int xPos = (dimScreen.width - INIT_WIDTH) / 2;
          ??int yPos = (dimScreen.height - INIT_HEIGHT) / 2;

          ??statusLabel.setText("系統狀態監視");
          ??statusLabel.setBounds(new Rectangle(45, 35, 280, 40));
          ??statusLabel.setToolTipText("當前系統的運行狀態");
          ??statusLabel.setFont(new Font("宋體", 0, 14));

          ??launchButton.setText("啟動");
          ??launchButton.setBounds(new Rectangle(80, 180, 80, 23));

          ??exitButton.setText("退出");
          ??exitButton.setBounds(new Rectangle(230, 180, 80, 23));

          ??this.getContentPane().add(statusLabel, null);
          ??this.getContentPane().add(launchButton, null);
          ??this.getContentPane().add(exitButton, null);

          ??launchButton.addActionListener(this);
          ??exitButton.addActionListener(this);

          ??this.setBounds(xPos, yPos, INIT_WIDTH, INIT_HEIGHT);

          ??icon.addSysTrayMenuListener(this);
          ??this.createMenu();
          ??this.setVisible(true);
          ?}

          ?/**
          ? * 創建菜單
          ? *
          ? */
          ?private void createMenu() {
          ??SysTrayMenuItem subItem1 = new SysTrayMenuItem("退出", "退出");
          ??subItem1.addSysTrayMenuListener(this);

          ??SysTrayMenuItem subItem2 = new SysTrayMenuItem("關于", "關于");
          ??subItem2.addSysTrayMenuListener(this);

          ??SysTrayMenuItem subItem3 = new SysTrayMenuItem("幫助", "幫助");
          ??subItem3.addSysTrayMenuListener(this);

          ??menu = new SysTrayMenu(icon, toolTip);// 生成菜單
          ??menu.addItem(subItem1);
          ??menu.addSeparator();
          ??menu.addItem(subItem2);
          ??menu.addItem(subItem3);
          ?}

          ?/**
          ? * 點擊按鈕事件
          ? */
          ?public void actionPerformed(ActionEvent e) {
          ??if (e.getActionCommand().equalsIgnoreCase("退出")) {
          ???System.exit(0);
          ??} else if (e.getActionCommand().equalsIgnoreCase("啟動")) {
          ???// 啟動計費程序

          ??}
          ?}

          ?/**
          ? * 菜單選擇事件
          ? */
          ?public void menuItemSelected(SysTrayMenuEvent e) {
          ??if (e.getActionCommand().equalsIgnoreCase("退出")) {
          ???System.exit(0);
          ??} else if (e.getActionCommand().equalsIgnoreCase("關于")) {
          ???JOptionPane.showMessageDialog(this, "寬帶計費接口" + "完成于2005-3-27");
          ??} else if (e.getActionCommand().equalsIgnoreCase("幫助")) {
          ???JOptionPane.showMessageDialog(this, "寬帶計費接口" + "幫助文件待寫...");
          ??}
          ?}

          ?/**
          ? * 左鍵單擊事件
          ? */
          ?public void iconLeftClicked(SysTrayMenuEvent e) {
          ??if (this.isVisible()) {// 如果可見,最小化
          ???this.setVisible(false);
          ??} else {// 如果不可見顯示出來
          ???this.setVisible(true);
          ??}
          ?}

          ?/**
          ? * 左鍵雙擊事件
          ? */
          ?public void iconLeftDoubleClicked(SysTrayMenuEvent e) {
          ??if (this.isVisible()) {// 如果可見,最小化
          ???this.setVisible(false);
          ??} else {// 如果不可見顯示出來
          ???this.setVisible(true);
          ??}
          ?}
          }


          tray.gif

          posted @ 2006-03-27 17:34 qiyadeng 閱讀(2969) | 評論 (2)編輯 收藏

          (Generic algorithms for Java)jga is a functors library: the intent is to explore and exploit functors as a design and implementation tool to reduce boilerplate coding. A functor is an object that encapsulates a function or expression: it can take arguments and produce results, as can any method, expression, or function (in other languages that support functions). Unlike an expression, as an object it can be passed as an argument without being executed; it can be persisted to a database or file; it can be serialized and passed from client to server (and back); and it can be instantiated at runtime based on information unavailable at compile-time.

          posted @ 2006-03-24 09:16 qiyadeng 閱讀(458) | 評論 (0)編輯 收藏

          美國聯邦法律規定:
           
            1)不得與豪豬發生性關系。(靠,誰敢呀) 
            2)每周四晚6:00以后不得放P。(以后還真要小心了,別一不留神坐牢了還不知為啥) 
            3)任何人不得銷售其子女。(好象中國也不許吧?) 


          阿拉巴馬州:
           
            無論任何時候,將冰激淋卷放在口袋里是違法的。(有病啊~~) 

            
          阿肯色州:
           
            男性可以合法毆打其配偶,但每月最多一次。 
            (估計很多暴力傾向的兄弟知道了一定想移民阿肯色了, 
            可也有例外呀,克林頓就是阿肯色的前州長,咋老被希拉里扁呀) 

            
          亞利桑納州:
           
            任何房間中不得有兩根以上的假陽具。 
            (估計那州的最高法官是個變態狂!) 

            
          夏威夷州:
           
            不得將谷物放在耳朵里。(神經病,以為偷太空種子呀) 

            
          印弟安納州:
           
            1)任何年滿18歲的男性,若與17歲以下的女性發生性關系,而且當時她又沒穿鞋襪,那將課重罪. 
            (兄弟們千萬注意了呀!別全了) 
            2)圓周率在該州法定為4。(活活氣死咱祖聰之前輩呀!) 

            
          愛荷華州:
           
            1)任何只有一只上臂的鋼琴演奏者必須免費演奏。(嚴重歧視殘疾藝術表演家) 
            2)任何有胃病的男性不得在公共場所與女性接吻。(接吻和胃有關系嗎?男性胃癌晚期患者的福音 

            
          紐約州:
           
            1)不得僅為娛樂而將球砸向他人腦袋。(謀殺可以不?真的腦子進水了) 
            2)10:00以后不得穿拖鞋。(光腳吧) 

            
          新澤西州:
           
            凡謀殺時不得穿防彈背心。(管得著嗎,警察這么沒自信!) 

            
          北卡州:
           
            任何一位未婚男性與一為未婚女性,如果在任何旅館或汽車旅館登記為已婚,那么他們即算合法夫妻了。(想帶小蜜開房的兄弟們千萬別去那州呀!) 

            
          賓西法尼亞州:
           
            不得在浴室唱歌。(難怪在賓大商學院的同胞都不會K歌) 

            
          南卡州:
           
            僅在每周六,男性被允許在法院的門前臺階上合法毆打其配偶。(這是啥規定,郁悶ING) 

            
          猶他州:
           
            1)不喝牛奶違法。(喝不完援助非洲難民呀,干么為難自己! 
            難怪俺一只要喝牛奶就拉肚子的朋友從猶大轉到紐約了,保命要緊呀。) 
            2)不得在正在執行急救任務的救護車后座上做愛。(這好理解,怕病人看見血管爆裂么!哈哈)

          posted @ 2006-02-26 22:11 qiyadeng 閱讀(184) | 評論 (0)編輯 收藏

          一、窮
          我想這已經是共識,沒錢?那就別想談女朋友了,別再幻想著什么純潔無暇愛情了,都是扯淡。當你憋著小嘴憤憤不平的拿這個詛咒分手女友的無情的時候,那只能說明你無能懦夫懶惰加上小人,離開你是明智選擇。給你個富婆說不定你絕情的嘴臉比誰都更丑陋。所以,男人,想討老婆就賺錢吧不管你混B社會殺人放火販毒contraband只要你能弄到票子女人就多得讓你眼花了。
          二、丑
          經典語句,長得丑不是你的錯,出來嚇人就是你不對了,如果你敢說一句外表不是主要的,心靈美才是重要的,打住,那我就給你一頭豬一樣的恐龍做老婆我看你什么反映,己所不欲勿施與人,當你做著癩蛤蟆想吃天鵝肉的美夢時,女孩還在走著灰姑娘的神呢。
          三、薄
          這個薄是臉皮薄的意思,如果你文質彬彬,甚至會害羞,傻傻的,你如果不是內心真有點城府的話,那看來你跟異性也是絕緣了,別想著八十年代電影里女孩說傻的可愛了,時代不同了,并且進步太快了。如果你能達到不要臉的流氓地步,也是泡妞的最高境界了。
          四、專
          這里指的是在一棵樹上吊死,如果你是個癡情專一的漢字,對一個MM渴望用堅持和癡情來感動,我想你離沉重打擊不遠了,現在的MM才不喜歡你用情專一呢,如果你能到處沾花惹草正說明你的本事,MM雖然會幽怨,其實底子里才更看得起你呢。保證你召之即來,揮之即去。
          五、笨
          這里的笨是指嘴笨,不需要你多厲害的口才,但是甜言蜜語是要會說的,哪怕你心里想著另一個MM,口里把對這個MM的感情換個名字說給那個聽也行,愛的肉麻。
          六、真
          其實和五差不多,就是太真誠了,MM是要來騙和哄的,你傻傻的都說實話掏老底,嘿嘿,那你也等著MM和你拜拜吧!
          七、小
          此小非彼小,嘿嘿,是膽小,好像和三類似,但也不是,只要有機會,能拉手早拉手,拉了手了要趕快親,親完了趕快找地上床,不要覺得太快了,現在是個效率的社會,你不快有人比你快,也別擔心MM會覺得你輕浮,她比你還急呢。不信?等上了床你就知道了。
          八、跑
          專指看貼不回貼就跑了的人,這類也是找不到女朋友的,自己掂量吧!

          posted @ 2006-02-21 20:21 qiyadeng 閱讀(338) | 評論 (0)編輯 收藏

          目錄

            前言
            一. Java 文檔和 javadoc
            二. 文檔注釋的格式
              1. 文檔注釋的格式化
              2. 文檔注釋的三部分
            三. 使用 javadoc 標記
              1. @see 的使用
              2. 使用 @author、@version 說明類
              3. 使用 @param、@return 和 @exception 說明方法
            四. javadoc 命令


          前言

            Java 的語法與 C++ 及為相似,那么,你知道 Java 的注釋有幾種嗎?是兩種?

            // 注釋一行
            /* ...... */ 注釋若干行

            不完全對,除了以上兩種之外,還有第三種,文檔注釋:

            /** ...... */ 注釋若干行,并寫入 javadoc 文檔

            通常這種注釋的多行寫法如下:

            /**
             * .........
             * .........
             */

            暫停,暫停!這第三種注釋有什么用?javadoc 又是什么東西?

            好,那就讓我告訴你——


          一. Java 文檔和 javadoc

            Java 程序員都應該知道使用 JDK 開發,最好的幫助信息就來自 SUN 發布的 Java 文檔。它分包、分類詳細的提供了各方法、屬性的幫助信息,具有詳細的類樹信息、索引信息等,并提供了許多相關類之間的關系,如繼承、實現接口、引用等。

            Java 文檔全是由一些 html 文件組織起來的,在 SUM 的站點上可以下載它們的壓縮包。但是你肯定想不到,這些文檔我們可以自己生成。——就此打住,再吊一次胃口。

            安裝了 JDK 之后,安裝目錄下有一個 src.jar 文件或者 src.zip 文件,它們都是以 ZIP 格式壓縮的,可以使用 WinZip 解壓。解壓之后,我們就可以看到分目錄放的全是 .java 文件。是了,這些就是 Java 運行類的源碼了,非常完整,連注釋都寫得一清二楚……不過,怎么看這些注釋都有點似曾相識的感覺?

            這就不奇怪了,我們的迷底也快要揭開了。如果你仔細對比一下 .java 源文件中的文檔注釋 (/** ... */) 和 Java 文檔的內容,你會發現它們就是一樣的。Java 文檔只是還在格式和排版上下了些功夫。再仔細一點,你會發現 .java 源文件中的注釋還帶有 HTML 標識,如 <B>、<BR>、<Code> 等,在 Java 文檔中,該出現這些標識的地方,已經按標識的的定義進行了排版。

            終于真像大白了,原來 Java 文檔是來自這些注釋。難怪這些注釋叫做文檔注釋呢!不過,是什么工具把這些注釋變成文檔的呢?

            是該請出 javadoc 的時候了。在 JDK 的 bin 目錄下你可以找到 javadoc,如果是 Windows 下的 JDK,它的文件名為 javadoc.exe。使用 javdoc 編譯 .java 源文件時,它會讀出 .java 源文件中的文檔注釋,并按照一定的規則與 Java 源程序一起進行編譯,生成文檔。

            介紹 javadoc 的編譯命令之前,還是先了解一下文檔注釋的格式吧。不過為了能夠編譯下面提到的若干例子,這里先介紹一條 javadoc 命令:

            javadoc -d 文檔存放目錄 -author -version 源文件名.java

            這條命令編譯一個名為 “源文件名.java”的 java 源文件,并將生成的文檔存放在“文檔存放目錄”指定的目錄下,生成的文檔中 index.html 就是文檔的首頁。-author 和 -version 兩個選項可以省略。


          二. 文檔注釋的格式

            文檔注釋可以用于對類、屬性、方法等進行說明。寫文檔注釋時除了需要使用 /** .... */ 限定之外,還需要注意注釋內部的一些細節問題。

            1. 文檔和文檔注釋的格式化

            生成的文檔是 HTML 格式,而這些 HTML 格式的標識符并不是 javadoc 加的,而是我們在寫注釋的時候寫上去的。比如,需要換行時,不是敲入一個回車符,而是寫入 <br>,如果要分段,就應該在段前寫入 <p>。

            因此,格式化文檔,就是在文檔注釋中添加相應的 HTML 標識。

            文檔注釋的正文并不是直接復制到輸出文件 (文檔的 HTML 文件),而是讀取每一行后,刪掉前導的 * 號及 * 號以前的空格,再輸入到文檔的。如

            /**
          * This is first line. <br>
          ***** This is second line. <br>
          This is third line.
          */

            編譯輸出后的 HTML 源碼則是

            This is first line. <br>
          This is second line. <br>
          This is third line.

            前導的 * 號允許連續使用多個,其效果和使用一個 * 號一樣,但多個 * 號前不能有其它字符分隔,否則分隔符及后面的 * 號都將作為文檔的內容。* 號在這里是作為左邊界使用,如上例的第一行和第二行;如果沒有前導的 * 號,則邊界從第一個有效字符開始,而不包括前面的空格,如上例第三行。

            還有一點需要說明,文檔注釋只說明緊接其后的類、屬性或者方法。如下例:

           
          /** comment for class */
          public class Test {
          
              /** comment for a attribute */
              int number;
          
              /** comment for a method */
              public void myMethod() { ...... }
          
              ......
          }

            上例中的三處注釋就是分別對類、屬性和方法的文檔注釋。它們生成的文檔分別是說明緊接其后的類、屬性、方法的。“緊接”二字尤其重要,如果忽略了這一點,就很可能造成生成的文檔錯誤。如

           
          import java.lang.*;
          
          /** commnet for class */
          
          public class Test { ...... }
          
          // 此例為正確的例子

            這個文檔注釋將生成正確的文檔。但只需要改變其中兩行的位置,變成下例,就會出錯:

           
          /** commnet for class */
          
          import java.lang.*;
          
          public class Test { ...... }
          
          // 此例為錯誤的例子

            這個例子只把上例的 import 語句和文檔注釋部分交換了位置,結果卻大不相同——生成的文檔中根本就找不到上述注釋的內容了。原因何在?

            “/** commnet for class */”是對 class Test 的說明,把它放在“public class Test { ...... }”之前時,其后緊接著 class Test,符合規則,所以生成的文檔正確。但是把它和“import java.lang.*;”調換了位置后,其后緊接的就是不 class Test 了,而是一個 import 語句。由于文檔注釋只能說明類、屬性和方法,import 語句不在此列,所以這個文檔注釋就被當作錯誤說明省略掉了。

            2. 文檔注釋的三部分

            根據在文檔中顯示的效果,文檔注釋分為三部分。先舉例如下,以便說明。

           
          /**
           * show 方法的簡述.
           * <p>show 方法的詳細說明第一行<br>
           * show 方法的詳細說明第二行
           * @param b true 表示顯示,false 表示隱藏
           * @return 沒有返回值
           */
          public void show(boolean b) {
              frame.show(b);
          }

            第一部分是簡述。文檔中,對于屬性和方法都是先有一個列表,然后才在后面一個一個的詳細的說明。列表中屬性名或者方法名后面那段說明就是簡述。如下圖中被紅框框選的部分:

          001.gif

            簡述部分寫在一段文檔注釋的最前面,第一個點號 (.) 之前 (包括點號)。換句話說,就是用第一個點號分隔文檔注釋,之前是簡述,之后是第二部分和第三部分。如上例中的 “* show 方法的簡述.”。

            有時,即使正確地以一個點號作為分隔,javadoc 仍然會出錯,把點號后面的部分也做為了第一部分。為了解決這個問題,我們可以使用一個 <p> 標志將第二分部分開為下一段,如上例的“* <p>show 方法的詳細說明第一行 ....”。除此之外,我們也可以使用 <br> 來分隔。

            第二部分是詳細說明部分。該部分對屬性或者方法進行詳細的說明,在格式上沒有什么特殊的要求,可以包含若干個點號。它在文檔中的位置如下圖所示:

          002.gif 

            這部分文檔在上例中相應的代碼是:

            * show 方法的簡述.
            * <p>show 方法的詳細說明第一行<br>
            * show 方法的詳細說明第二行

            發現什么了?對了,簡述也在其中。這一點要記住了,不要畫蛇添足——在詳細說明部分中再寫一次簡述哦!

            第三部分是特殊說明部分。這部分包括版本說明、參數說明、返回值說明等。它在文檔中的位置:

          003.gif

            第三部分在上例中相應的代碼是

            * @param b true 表示顯示,false 表示隱藏
            * @return 沒有返回值

            除了 @param 和 @return 之外,還有其它的一些特殊標記,分別用于對類、屬性和方法的說明……不要推我,我馬上就說。


          三. 使用 javadoc 標記

            javadoc 標記是插入文檔注釋中的特殊標記,它們用于標識代碼中的特殊引用。javadoc 標記由“@”及其后所跟的標記類型和專用注釋引用組成。記住了,三個部分——@、標記類型、專用注釋引用。不過我寧愿把它分成兩部分:@ 和標記類型、專用注釋引用。雖然 @ 和 標記類型之間有時可以用空格符分隔,但是我寧愿始終將它們緊挨著寫,以減少出錯機會。

            javadoc 標記有如下一些:

          標記 用于 作用
          @author 對類的說明 標明開發該類模塊的作者
          @version 對類的說明 標明該類模塊的版本
          @see 對類、屬性、方法的說明 參考轉向,也就是相關主題
          @param 對方法的說明 對方法中某參數的說明
          @return 對方法的說明 對方法返回值的說明
          @exception 對方法的說明 對方法可能拋出的異常進行說明

            下面詳細說明各標記。

            1. @see 的使用

            @see 的句法有三種:

            @see 類名
            @see #方法名或屬性名
            @see 類名#方法名或屬性名

            類名,可以根據需要只寫出類名 (如 String) 或者寫出類全名 (如 java.lang.String)。那么什么時候只需要寫出類名,什么時候需要寫出類全名呢?

            如果 java 源文件中的 import 語句包含了的類,可以只寫出類名,如果沒有包含,則需要寫出類全名。java.lang 也已經默認被包含了。這和 javac 編譯 java 源文件時的規定一樣,所以可以簡單的用 javac 編譯來判斷,源程序中 javac 能找到的類,javadoc 也一定能找到;javac 找不到的類,javadoc 也找不到,這就需要使用類全名了。

            方法名或者屬性名,如果是屬性名,則只需要寫出屬性名即可;如果是方法名,則需要寫出方法名以及參數類型,沒有參數的方法,需要寫出一對括號。如

          成員類型 成員名稱及參數 @see 句法
          屬性 number @see number
          屬性 count @see count
          方法 count() @see count()
          方法 show(boolean b) @see show(boolean)
          方法 main(String[] args) @see main(String[])

            有時也可以偷懶:假如上例中,沒有 count 這一屬性,那么參考方法 count() 就可以簡寫成 @see count。不過,為了安全起見,還是寫全 @see count() 比較好。

            @see 的第二個句法和第三個句法都是轉向方法或者屬性的參考,它們有什么區別呢?

            第二個句法中沒有指出類名,則默認為當前類。所以它定義的參考,都轉向本類中的屬性或者方法。而第三個句法中指出了類名,則還可以轉向其它類的屬性或者方法。

            關于 @see 標記,我們舉個例說明。由于 @see 在對類說明、對屬性說明、對方法說明時用法都一樣,所以這里只以對類說明為例。

           
          /**
           * @see String
           * @see java.lang.StringBuffer
           * @see #str
           * @see #str()
           * @see #main(String[])
           * @see Object#toString()
           */
          public class TestJavaDoc {
          
          }

            生成的文檔的相關部分如下圖:

          004.gif

            String 和 StringBuffer 都是在 java.lang 包中,由于這個包是默認導入了的,所以這兩個類可以直接寫類名,也可以寫類全名。str、str() 為同名屬性和方法,所以方法名需要用 () 區分。main 是帶參數的方法,所以在 () 中指明了參數類型。toString() 雖然在本類中也有 (從 Object 繼承的),但我們是想參考 Object 類的 toString() 方法,所以使用了 Object#toString()。

            奇怪的是,為什么其中只有 str、str() 和 main(String[]) 變成了鏈接呢?那是因為編譯時沒有把 java.lang 包或者 Stirng、StringBuffer、Object 三個類的源文件一起加入編譯,所以,生成的文檔沒有關于那三個類的信息,也就不可以建立鏈接了。后面講解 javadoc 編譯命令的時候還會詳細說明。

            上例中如果去把類中的 str 屬性去掉,那么生成的文檔又會有什么變化呢?你會發現,原來是 str, str(),而現在變成了 str(), str(),因為 str 屬性已經沒有了,所以 str 也表示方法 str()。

            2. 使用 @author、@version 說明類

            這兩個標記分別用于指明類的作者和版本。缺省情況下 javadoc 將其忽略,但命令行開關 -author 和 -version 可以修改這個功能,使其包含的信息被輸出。這兩個標記的句法如下:

            @author 作者名
            @version 版本號

            其中,@author 可以多次使用,以指明多個作者,生成的文檔中每個作者之間使用逗號 (,) 隔開。@version 也可以使用多次,只有第一次有效,生成的文檔中只會顯示第一次使用 @version 指明的版本號。如下例

           
          /**
           * @author Fancy
           * @author Bird
           * @version Version 1.00
           * @version Version 2.00
           */
          public class TestJavaDoc {
          
          }

            生成文檔的相關部分如圖:

          005.gif

            從生成文檔的圖示中可以看出,兩個 @author 語句都被編譯,在文檔中生成了作者列表。而兩個 @version 語句中只有第一句被編譯了,只生成了一個版本號。

            從圖上看,作者列表是以逗號分隔的,如果我想分行顯示怎么辦?另外,如果我想顯示兩個以上的版本號又該怎么辦?

            ——我們可以將上述兩條 @author 語句合為一句,把兩個 @version 語句也合為一句:

            @author Fancy<br>Bird
            @version Version 1.00<br>Version 2.00

            結果如圖:

            我們這樣做即達到了目的,又沒有破壞規則。@author 之后的作者名和 @version 之后的版本號都可以是用戶自己定義的任何 HTML 格式,所以我們可以使用 <br> 標記將其分行顯示。同時,在一個 @version 中指明兩個用 <br> 分隔的版本號,也沒有破壞只顯示第一個 @version 內容的規則。

            3. 使用 @param、@return 和 @exception 說明方法

            這三個標記都是只用于方法的。@param 描述方法的參數,@return 描述方法的返回值,@exception 描述方法可能拋出的異常。它們的句法如下:

            @param 參數名 參數說明
            @return 返回值說明
            @exception 異常類名 說明

            每一個 @param 只能描述方法的一個參數,所以,如果方法需要多個參數,就需要多次使用 @param 來描述。

            一個方法中只能用一個 @return,如果文檔說明中列了多個 @return,則 javadoc 編譯時會發出警告,且只有第一個 @return 在生成的文檔中有效。

            方法可能拋出的異常應當用 @exception 描述。由于一個方法可能拋出多個異常,所以可以有多個 @exception。每個 @exception 后面應有簡述的異常類名,說明中應指出拋出異常的原因。需要注意的是,異常類名應該根據源文件的 import 語句確定是寫出類名還是類全名。   示例如下:

           
          public class TestJavaDoc {
          
              /**
               * @param n a switch
               * @param b excrescent parameter
               * @return true or false
               * @return excrescent return
               * @exception java.lang.Exception throw when switch is 1
               * @exception NullPointerException throw when parameter n is null
               */
              public boolean fun(Integer n) throws Exception {
                  switch (n.intValue()) {
                  case 0:
                      break;
                  case 1:
                      throw new Exception("Test Only");
                  default:
                      return false;
                  }
                  return true;
              }
          
          }

            使用 javadoc 編譯生成的文檔相關部分如下圖:

            可以看到,上例中 @param b excrescent parameter 一句是多余的,因為參數只是一個 n,并沒有一個 b但是 javadoc 編譯時并沒有檢查。因此,寫文檔注釋時一定要正確匹配參數表與方法中正式參數表的項目。如果方法參數表中的參數是 a,文檔中卻給出對參數 x 的解釋,或者再多出一個參數 i,就會讓人摸不著頭腦了。@exceptin 也是一樣。

            上例程序中并沒有拋出一個 NullPointerException,但是文檔注釋中為什么要寫上這么一句呢,難道又是為了演示?這不是為了演示描述多余的異常也能通過編譯,而是為了說明寫異常說明時應考運行時 (RunTime) 異常的可能性。上例程序中,如果參數 n 是給的一個空值 (null),那么程序會在運行的時候拋出一個 NullPointerException,因此,在文檔注釋中添加了對 NullPointerException 的說明。

            上例中的 @return 語句有兩個,但是根據規則,同一個方法中,只有第一個 @return 有效,其余的會被 javadoc 忽略。所以生成的文檔中沒有出現第二個 @return 的描述。

            講到這里,該怎么寫文檔注釋你應該已經清楚了,下面就開始講解 javadoc 的常用命令。


          四. javadoc 命令

            運行 javadoc -help 可以看到 javadoc 的用法,這里列舉常用參數如下:

          用法:
            javadoc [options] [packagenames] [sourcefiles]

          選項:

            -public 僅顯示 public 類和成員
            -protected 顯示 protected/public 類和成員 (缺省)
            -package 顯示 package/protected/public 類和成員
            -private 顯示所有類和成員
            -d <directory> 輸出文件的目標目錄
            -version 包含 @version 段
            -author 包含 @author 段
            -splitindex 將索引分為每個字母對應一個文件
            -windowtitle <text> 文檔的瀏覽器窗口標題

            javadoc 編譯文檔時可以給定包列表,也可以給出源程序文件列表。例如在 CLASSPATH 下有兩個包若干類如下:

            fancy.Editor
            fancy.Test
            fancy.editor.ECommand
            fancy.editor.EDocument
            fancy.editor.EView

            這里有兩個包 (fancy 和 fancy.editor) 和 5 個類。那么編譯時 (Windows 環境) 可以使用如下 javadoc 命令:

            javadoc fancy\Test.java fancy\Editor.java fancy\editor\ECommand.java fancy\editor\EDocument.java fancy\editor\EView.java

            這是給出 java 源文件作為編譯參數的方法,注意命令中指出的是文件路徑,應該根據實際情況改變。也可以是給出包名作為編譯參數,如:

            javadoc fancy fancy.editor

            用瀏覽器打開生成文檔的 index.html 文件即可發現兩種方式編譯結果的不同,如下圖:

            用第二條命令生成的文檔被框架分成了三部分:包列表、類列表和類說明。在包列表中選擇了某個包之后,類列表中就會列出該包中的所有類;在類列表中選擇了某個類之后,類說明部分就會顯示出該類的詳細文檔。而用第一條命令生成的文檔只有兩部分,類列表和類說明,沒有包列表。這就是兩種方式生成文檔的最大區別了。

            下面再來細說選項。

            -public、-protected、-package、-private 四個選項,只需要任選其一即可。它們指定的顯示類成員的程度。它們顯示的成員多少是一個包含的關系,如下表:

          -private (顯示所有類和成員)
          -package (顯示 package/protected/public 類和成員)
          -protected (顯示 protected/public 類和成員)
          -public (僅顯示 public 類和成員)

            -d 選項允許你定義輸出目錄。如果不用 -d 定義輸出目錄,生成的文檔文件會放在當前目錄下。-d 選項的用法是

            -d 目錄名

            目錄名為必填項,也就是說,如果你使用了 -d 參數,就一定要為它指定一個目錄。這個目錄必須已經存在了,如果還不存在,請在運行 javadoc 之前創建該目錄。

            -version 和 -author 用于控制生成文檔時是否生成 @version 和 @author 指定的內容。不加這兩個參數的情況下,生成的文檔中不包含版本和作者信息。

            -splitindex 選項將索引分為每個字母對應一個文件。默認情況下,索引文件只有一個,且該文件中包含所有索引內容。當然生成文檔內容不多的時候,這樣做非常合適,但是,如果文檔內容非常多的時候,這個索引文件將包含非常多的內容,顯得過于龐大。使用 -splitindex 會把索引文件按各索引項的第一個字母進行分類,每個字母對應一個文件。這樣,就減輕了一個索引文件的負擔。

            -windowtitle 選項為文檔指定一個標題,該標題會顯示在窗口的標題欄上。如果不指定該標題,而默認的文檔標題為“生成的文檔(無標題)”。該選項的用法是:

            -windowtitle 標題

            標題是一串沒有包含空格的文本,因為空格符是用于分隔各參數的,所以不能包含空格。同 -d 類似,如果指定了 -windowtitle 選項,則必須指定標題文本。

            到此為止,Java 文檔和 javadoc 就介紹完了。javadoc 真的能讓我們在 Java 注釋上做文章——生成開發文檔。

          posted @ 2006-02-20 15:41 qiyadeng 閱讀(1417) | 評論 (1)編輯 收藏

          ISBN號是國際標準書號的簡稱,它是國際標準化組織于1972年公布的一項國際通用的出版物統一編號方法。所有正規出版的普通圖書版權頁都有ISBN 號,ISBN是 international standard of book number 幾個英文字母的縮寫,即國際標準書號。它由10位數字組成,這10位數字由組號、出版者號、書名號、校驗號這四部分組成,其間用“--”相連。

            ISBN號是由10位數字組成,共分四段:

          1.組號: 代表出版者的國家,地理區域,語種等.我國的組號為"7"。

          2.出版者號: 代表組內所屬的一個具體出版者(出版社,出版公司等)。由國家或地區的ISBN中心設置和分配,可取1-7位數字。

          3.書名號:書名號是由出版者給予每種出版物的編號。

          4. 校驗號: 校驗號是ISBN號的最后一位數值,它能夠校驗出ISBN號是否正確,即:將ISBN1-9位數字順序乘以10-2這9個數字,將這些乘積之和再加上校驗 號,假如能被11整除,則這個ISBN號是正確的,算式為7*10+3*9+0*8 +5*7+0*6+1*5+5*4+6*3+8*2+7= 198,198/11=18,能被11整除。校驗號只能是1位數,當為10時,記為羅馬數字X。

          posted @ 2006-02-17 10:18 qiyadeng 閱讀(439) | 評論 (0)編輯 收藏

           該文章在<<EJB編程指南>>的實例的基礎上建立的,主要是給新手一個比較直觀的例子和作為自己的日志,并不打算介紹EJB的原理性的東西。另外,由于本人水平有限,請不吝賜教。
              筆者使用的IDE為:Eclipse3.0+MyEclipse4.01GA
              J2EE容器為:JBoss4.0
             
              本文描述一個幫助存款和取款的無狀態會話Bean的完整開發及部署的過程。步驟如下:
          1、編寫無狀態會話Bean的實現類。
          2、編寫無狀態會話Bean的主接口和組件接口。
          3、將Bean匯編成應用程序,編寫部署描述項。
          4、在EJB服務器上部署應用程序。
          5、用Java應用程序進行測試。
          上面是主要的過程,有些步驟可以不用手工完成,通過IDE可以簡化開發過程,如果你對IDE的該功能不太清楚可以參考產品文檔(http: //myeclipseide.com/enterpriseworkbench/help/index.jsp?topic=/com.genuitec.myeclipse.doc/html/quickstarts/firstejb/index.html)。

          一、新建一個EJB Project,工程名字為FundEJB,其他默認就好。
          二、創建Session Bean:
              1、在src目錄下新建包:qiya.deng.fund.ejb,請注意包名最后一定要以ejb為后綴,因為后面我們需要使用的XDoclet工具。
              2、新建SessionBean class,命名為StatelessFundManagerEJB,要需要以EJB為后綴,原因同上,而且根據規范最好是以EJB或是Bean為后綴。
             

              3、配置XDoclet :
              右擊項目選擇Properties,選擇MyEclipse-XDoclet,點擊Add Stander...,選擇Standard EJB。
             
              選中Standard EJB,在ejbxdoclet上點擊右鍵添加Add,在其中選擇jboss,因為該例子中使用jboss作為應用服務器。選中jboss,修改下列屬性
              Version = 4.0
              destDir = src/META-INF
             修改完畢,點擊OK按鈕回到主窗口。

              4、運行Xdoclet:
              右擊項目選擇MyEclipse->run Xdoclet。運行是console窗口會產生提示信息,運行完畢可以看到目錄結構發生變化。
             
              5、編輯實現類StatelessFundManagerEJB:
              在編輯StatelessFundManagerEJB類之前選觀察下StatelessFundManager接口,一定可以發現這個遠程組件接口的接口方法和StatelessFundManager的方法是有對應關系的。
              在StatelessFundManager.java文件最后添加:

                  /**
               *
               * @param balance
               * @param amount
               * @return
               *
               * @ejb.interface-method
               */
              public double addFunds(double balance,double amount){
                  balance += amount;
                  return balance;
              }
             
              /**
               *
               * @param balance
               * @param amount
               * @return
               * @throws InsufficientBalanceException
               *
               * @ejb.interface-method
               */
              public double withdrawFunds(double balance,double amount)throws InsufficientBalanceException {
                  if (balance < amount) {
                      throw (new InsufficientBalanceException());
                  }
                  balance -= amount;
                  return balance;
              }
              重復第4步運行Xdoclet,之后觀察StatelessFundManager接口。

             6、部署該應用到EJB服務器:
              部署描述項在IDE自動生成了,該文件的位置在/META-INF/ejb-jar.xml。打開ejb-jar.xml,jboss.xml文件描述進行查看。
              利用MyEclipse提供的部署工具進行部署:
             
              然后運行JBoss容器,可以看到有如下信息提示:

             

              關于MyEclipse中Application Server的使用請查看文檔(http://www.myeclipseide.com/images/tutorials/quickstarts/appservers/)。
              到現在為止,你已經發布了一個簡單的無狀態的會話Bean。下面寫個簡單的應用程序進行測試.
             
          三、編寫進行測試的Java客戶端程序。
              客戶端程序可以是Web程序也可以是Application應用程序。這里以Application應用程序為例。
              同樣使用Eclipse,新建Java Project,這里命名為FundClient。右擊該項目選擇properties->Java Build path,在Projects中加入上面的Project:FundEJB。在Libraries中點擊Add External JARs...,把$JBoss_Home/client的目錄下的所有jar文件添加到Libraries中。
              最后,就是編寫客戶端代碼:

          package qiya.deng.client;
              //import省去
          public class StatelessFundManagerTestClient extends JFrame implements
                  ActionListener {

              double balance = 0;
              JTextField amount = new JTextField(10);
              JButton addFunds = new JButton("Add Funds");
              JButton withdrawFunds = new JButton("Withdraw Funds");
              String msg = "Current account balance";
              String strBal = "0";
              JLabel status;
              StatelessFundManager manager;
              NumberFormat currencyFormatter;
             
              public StatelessFundManagerTestClient(){
                  super("Fund Manager");
              }
             
              public static void main(String[] args){
                  new StatelessFundManagerTestClient().init();
              }
             
              private void init() {
                 
                  buildGUI();
                 
                  addWindowListener(new WindowAdapter(){
                      public void windowClosing(WindowEvent event){
                          System.exit(0);
                      }
                  });
                 
                  addFunds.addActionListener(this);
                  withdrawFunds.addActionListener(this);
                 
                  createFundManager();
                 
                  currencyFormatter = NumberFormat.getCurrencyInstance();
                  String currencyOut = currencyFormatter.format(0);
                  status.setText(msg + currencyOut);
                 
                  pack();
                  show();
              }

              private void buildGUI() {
                  GridBagLayout gl = new GridBagLayout();
                  GridBagConstraints gc = new GridBagConstraints();
                  Container container = getContentPane();
                  container.setLayout(gl);
                 
                  gc.fill = GridBagConstraints.BOTH;
                  JLabel label = new JLabel("Enter Amount");
                  gl.setConstraints(label,gc);
                  container.add(label);
                 
                  gc.gridwidth = GridBagConstraints.REMAINDER;
                  gl.setConstraints(amount,gc);
                  container.add(amount);
                 
                  gl.setConstraints(addFunds,gc);
                  container.add(addFunds);
                  gl.setConstraints(withdrawFunds,gc);
                  container.add(withdrawFunds);
                 
                  status = new JLabel(msg);
                  gl.setConstraints(status,gc);
                  container.add(status);
              }

              public void createFundManager(){
                  try {
                      Properties prop = new Properties();
                      prop.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
                      prop.put(Context.PROVIDER_URL,"localhost:1099");
                      Context initial = new InitialContext(prop);
                      Object objref = initial.lookup("ejb/StatelessFundManager");//JINI-Name
                      StatelessFundManagerHome home =
                          (StatelessFundManagerHome) PortableRemoteObject.narrow(objref,StatelessFundManagerHome.class);
                      manager = home.create();
                  } catch (ClassCastException e) {
                      e.printStackTrace();
                  } catch (RemoteException e) {
                      e.printStackTrace();
                  } catch (NamingException e) {
                      e.printStackTrace();
                  } catch (CreateException e) {
                      e.printStackTrace();
                  }
              }

              public void actionPerformed(ActionEvent e) {
                 
                 
                 
                  if (e.getActionCommand().equalsIgnoreCase("Withdraw Funds")) {
                      System.out.println("Withdraw Funds");
                  }
                  if (e.getActionCommand().equalsIgnoreCase("Add Funds")) {
                      System.out.println("Add Funds");
                  }
                 
                  if (e.getSource().equals(addFunds)){
                      System.out.println("addFunds");
                      try {
                          status.setText(msg + currencyFormatter.format(manager.addFunds(0,Double.parseDouble(amount.getText()))));
                      } catch (NumberFormatException e1) {
                          e1.printStackTrace();
                      } catch (RemoteException e1) {
                          e1.printStackTrace();
                      }
                  }
                  if (e.getSource().equals(withdrawFunds)){
                      System.out.println("withdrawFund");
                      try {
                          status.setText(msg + currencyFormatter.format(manager.withdrawFunds(100,Double.parseDouble(amount.getText()))));
                      } catch (NumberFormatException e1) {
                          e1.printStackTrace();
                      } catch (RemoteException e1) {
                          e1.printStackTrace();
                      } catch (InsufficientBalanceException e1) {
                          e1.printStackTrace();
                      }
                  }
              }

          }
              然后,你可以運行該程序進行測試了:
               
              至此,恭喜你,你已經大功告成,基本上對EJB建立了感性的認識,可以參考資料進行深入的學習了。

          posted @ 2006-02-04 20:17 qiyadeng 閱讀(745) | 評論 (0)編輯 收藏

             今天是大年的初一,新年的第一天!!!祝所有的朋友春節快樂,狗年旺旺(好像關于狗年的賀詞不多)!也希望自己新的一年來進步多多,有所作為。

          posted @ 2006-01-29 22:50 qiyadeng 閱讀(275) | 評論 (0)編輯 收藏

          因為需要對網絡環境進行監控,做了個Java程序在linux服務器上運行。但是每次重新啟動的時候都要手動的運行,這樣就不太現實。所以想到把Java程序做成像Windows的系統服務那樣,開機就會自動在后臺運行。以前使用過一個工具http://javaservice.objectweb.org/,可以把Java程序注冊成為Windows的系統服務,而且使用起來很簡單,但是遺憾的是該工具不能注冊linux的后臺服務。所以不得不另外尋找工具。

           

             最后找到了JavaService Wrapper(http://wrapper.tanukisoftware.org/doc/english/introduction.html),該工具能在很多中平臺下面注冊為系統服務(查看支持平臺)。該工具使用方法有三種模式,我用的是第一種WrapperSimpleApp幫助類,另外的兩種方式都需要在原來的程序上進行適當的編碼。下面就用我的程序NetWatchDog為例子說明下大概的配置步驟。(其實文檔中已經用Jboss進行了演示)

           

          1.建立一個目錄名為NetWatchDog,并在該目錄下建立bin,lib,conf,logs目錄。以下把NetWatchDog目錄稱為$DOG_HOME。

          2.把下載來的文件解壓,把$WRAPPER_HOME/bin/wrapper,$WRAPPER_HOME/src/bin/sh.script.in文件copy到$DOG_HOME/bin目錄中。

          3.把sh.script.in文件該名為你的服務名稱,這里改為NetWatchDog。

          4.編輯NetWatchDog,把Application的相關信息改為如下:

          APP_NAME="NetWatchDog"
          APP_LONG_NAME="NetWatchDog Application"

          5.把你的程序的打包成jar文件,拷貝到$DOG_HOME/lib目錄下,并把$WRAPPER_HOME/lib/libwrapper.so,$WRAPPER_HOME/lib/wrapper.jar文件也拷貝到$DOG_HOME/lib目錄下面。

          6.這步比較重要是成敗的關鍵,把$WRAPPER_HOME/conf/wrapper.conf文件拷貝到$DOG_HOME/conf目錄下(文檔上面說的是wrapper.conf.in文件,但是我下載來的文件就是wrapper.conf,所以步需要改名的)。

          7.編輯wrapper.conf文件:

          #java命令的位置

          wrapper.java.command=%JAVA_HOME%/bin/java

          #wrapper的主類

          wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

          #java classpath

          wrapper.java.classpath.1=../lib/wrapper.jar
          wrapper.java.classpath.2=%JAVA_HOME%/jre/lib/ext/log4j-1.2.13.jar
          wrapper.java.classpath.3=%JAVA_HOME%/jre/lib/ext/activation.jar
          wrapper.java.classpath.4=%JAVA_HOME%/jre/lib/ext/commons-email-1.0.jar
          wrapper.java.classpath.5=%JAVA_HOME%/jre/lib/ext/mail.jar
          wrapper.java.classpath.6=../lib/NetWatchDog.jar
          #你的程序的主類,將作為wrapper的參數

          wrapper.app.parameter.1=qiya.deng.main.Main

          8.這樣基本就大功告成了,現在可以運行命令./NetWatchDog  start,如果提示權限不夠就用chmod 755 NetWatchDog命令改變權限。如果沒出現錯誤提示,這樣基本上就正確了。
          另外Windwos版本可以參考:http://blog.chinaunix.com/u/1677/?u=http://blog.chinaunix.com/u/1677/showart.php?id=67084

          posted @ 2006-01-25 09:34 qiyadeng 閱讀(5979) | 評論 (3)編輯 收藏

          僅列出標題
          共9頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 
          主站蜘蛛池模板: 陆良县| 内丘县| 吉林市| 罗甸县| 获嘉县| 德化县| 岱山县| 依兰县| 临汾市| 肇庆市| 正定县| 东港市| 东兰县| 镇沅| 营口市| 广灵县| 镇平县| 崇州市| 射洪县| 岑溪市| 甘洛县| 平果县| 旌德县| 康平县| 丰原市| 临夏县| 夹江县| 怀来县| 子洲县| 舞钢市| 武安市| 益阳市| 瓦房店市| 威信县| 安徽省| 越西县| 伊通| 广昌县| 石渠县| 安宁市| 治多县|