diff --git a/README.md b/README.md index 07c9a95..d166e19 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ Java SE 6 技術手冊 我在 GitBook 上用這本書前半本 [試排了一個版本](http://caterpillar.gitbooks.io/javase6tutorial/),如果你需要在 GitBook 上取得完整版本,請跟我聯絡! -《Java SE 6 技術手冊》(以及它先前的版本)是以 [我的網站](https://openhome.cc) 中早期學習 Java 的筆記 [JavaGossip1](https://openhome.cc/Gossip/JavaGossip-V1/) 與 [JavaGossip2](https://openhome.cc/Gossip/JavaGossip-V2/) 為基礎,記錄著我學習 Java 的一些心得。 +《Java SE 6 技術手冊》(以及它先前的版本)是以 [我的網站](https://openhome.cc) 中早期學習 Java 的筆記 JavaGossip1 與 JavaGossip2 為基礎,記錄著我學習 Java 的一些心得。 -在 JDK7 問世之後,由於累積不少 Java 教學經驗與想法,為了有一本可以符合我教學所需的教材,因而在為 JDK7 撰寫 Java 書籍時,並不是改版《Java SE 6 技術手冊》,而是重新撰寫了一本 [《Java SE 7 技術手冊》](http://books.gotop.com.tw/bookdetails.aspx?bn=ACL034000)。 +在 JDK7 問世之後,由於累積不少 Java 教學經驗與想法,為了有一本可以符合我教學所需的教材,因而在為 JDK7 撰寫 Java 書籍時,並不是改版《Java SE 6 技術手冊》,而是重新撰寫了一本 [《Java SE 7 技術手冊》](https://play.google.com/store/books/details/%E6%9E%97%E4%BF%A1%E8%89%AF_Java_SE_7%E6%8A%80%E8%A1%93%E6%89%8B%E5%86%8A_%E9%9B%BB%E5%AD%90%E6%9B%B8?id=qscCBAAAQBAJ)。 《Java SE 6 技術手冊》呢?就我目前來看它,真的就像是筆記,然而就因為是筆記,想法、口吻、脈絡甚至範例上,都比較適合新手,在靜靜地留在我硬碟近兩年,我有一天看到它,想說放著也是沒用,不如開放它 ... @@ -21,7 +21,7 @@ Java SE 6 技術手冊 原始碼範例都改為 UTF-8 編碼了,因此使用 `javac` 編譯時,記得加上 `-encoding UTF-8`。 -新的 Java 文件基於 JDK9 而撰寫,你可以在 [我的網站](https://openhome.cc) 上的 [Java Gossip](https://openhome.cc/Gossip/Java/) 進行閱讀。 +新的 Java 文件基於 JDK17 而撰寫,你可以在 [我的網站](https://openhome.cc) 上的 [Java](https://openhome.cc/zh-tw/java/) 進行閱讀。 ---------- diff --git a/docs/CH12.md b/docs/CH12.md index 8dbf433..20d0787 100644 --- a/docs/CH12.md +++ b/docs/CH12.md @@ -198,8 +198,8 @@ public class GenericFoo2 { 您可以如下使用 GenericFoo2 類別,分別以 Integer 與 Boolean 設定 T1 與 T2 的真正型態: - GenericFoo foo = - new GenericFoo(); + GenericFoo2 foo = + new GenericFoo2(); 泛型可以用於宣告陣列型態,範例 12.7 是個簡單示範。 diff --git a/docs/CH19.md b/docs/CH19.md index 8870d17..4745bca 100644 --- a/docs/CH19.md +++ b/docs/CH19.md @@ -1,6 +1,6 @@ # 第 19 章 專題製作 - 文字編輯器 -在學習完一個程式語言的基本語法、API 的使用之後,若要驗收學習的成果,試著自己撰寫一個文字編輯器是個不錯的驗收方式,在這個章節中將一步步告訴您,如何組合前面18個章節中學習到的語法及 API 功能,實作出一個具讀取、儲存功能的視窗文字編輯器。 +在學習完一個程式語言的基本語法、API 的使用之後,若要驗收學習的成果,試著自己撰寫一個文字編輯器是個不錯的驗收方式,在這個章節中將一步步告訴您,如何組合前面 18 個章節中學習到的語法及 API 功能,實作出一個具讀取、儲存功能的視窗文字編輯器。 在這個章節中,您也將學到基本的 Swing 視窗程式設計,了解 Java 的視窗程式中容器(Container)、元件(Component)、版面管理員(Layout Manager)、事件(Event)與傾聽者(Listener)的基本觀念。 @@ -16,7 +16,7 @@ - 具備視窗介面 - 您必須決定使用者將如何操作您的文字編輯器,這要考量使用者在操作上的習慣,或是領域(Domain)特有的操作需求,操作介面設計良好與否,對一個產品是否受歡迎有相當大的影響,您可以觀察所要開發的程式是否有相類似的產品,看看該產品是如何設計操作介面的,對於簡單的文字編輯器之開發,可以參考Windows的「記事本」程式在介面上是如何設計的。 + 您必須決定使用者將如何操作您的文字編輯器,這要考量使用者在操作上的習慣,或是領域(Domain)特有的操作需求,操作介面設計良好與否,對一個產品是否受歡迎有相當大的影響,您可以觀察所要開發的程式是否有相類似的產品,看看該產品是如何設計操作介面的,對於簡單的文字編輯器之開發,可以參考 Windows 的「記事本」程式在介面上是如何設計的。 您可以在紙上或繪圖軟體上,先設計出操作介面草稿,在設計介面的同時,也會大致勾勒出應用程式的部份功能,對於您將開發的文字編輯器,將具備以下的視窗介面: @@ -78,7 +78,7 @@ ### 19.1.3 開發(Development) -進入開發階段之後,將決定使用何種語言及技術來開發應用程式,在這個章節中,您將使用 Java 程式語言,並運用 Java SE 技術來開發文字編輯器,文字編輯器的介面將使用Swing視窗元件來開發,這也是這個章節所要著重的階段。 +進入開發階段之後,將決定使用何種語言及技術來開發應用程式,在這個章節中,您將使用 Java 程式語言,並運用 Java SE 技術來開發文字編輯器,文字編輯器的介面將使用 Swing 視窗元件來開發,這也是這個章節所要著重的階段。 ### 19.1.4 測試(Testing) @@ -102,7 +102,7 @@ ## 19.2 Swing 入門 -若要使用 Java SE 來開發視窗應用程式,就本書撰寫的時間點來說可以有兩種選擇,一個是使用 AWT(Abstract Window Toolkit),另一個是使用 JFC(Java Foundation Classes)/Swing。您所要開發的文字編輯器將使用 Swing 技術,Swing 的使用可以很複雜,是個可以用專書介紹的技術,而這個小節的目的,在讓您於開發文字編輯器的介面,同時也可以掌握 Swing 設計的最基本要素,也就是容器(Container)、元件(Component)、版面管理員(Layout Manager)、事件(Event)與傾聽者(Listener)等基本觀念。 +若要使用 Java SE 來開發視窗應用程式,就本書撰寫的時間點來說可以有兩種選擇,一個是使用 AWT(Abstract Window Toolkit),另一個是使用 JFC(Java Foundation Classes)/ Swing。您所要開發的文字編輯器將使用 Swing 技術,Swing 的使用可以很複雜,是個可以用專書介紹的技術,而這個小節的目的,在讓您於開發文字編輯器的介面,同時也可以掌握 Swing 設計的最基本要素,也就是容器(Container)、元件(Component)、版面管理員(Layout Manager)、事件(Event)與傾聽者(Listener)等基本觀念。 ### 19.2.1 Swing 簡介 @@ -161,7 +161,7 @@ Swing 的元件相當的豐富,若要詳細說明,實際上可以另外出 - 主視窗 -您可以繼承 javax.swing.JFrame 來撰寫一個可以呈現在螢幕上的視窗,最基本的動作包括:設定視窗元件、設定事件處理、呈現畫面。直接使用範例 19.1 來示範如何呈現一個基本的Swing視窗。 +您可以繼承 javax.swing.JFrame 來撰寫一個可以呈現在螢幕上的視窗,最基本的動作包括:設定視窗元件、設定事件處理、呈現畫面。直接使用範例 19.1 來示範如何呈現一個基本的 Swing 視窗。 #### **範例 19.1 JNotePadUI.java** ```java @@ -193,7 +193,7 @@ public class JNotePadUI extends JFrame { 在範例 19.1 中,將視窗元件的設置與事件的處理分別交由 setUpUIComponent() 與 setUpEventListener() 兩個方法來處理,這有助於將來程式碼內容增加時的管理。 -JFrame 擁有一個接受字串引數的建構方法,被設置的字串將用作視窗的標題文字,從 JFrame 繼承下來的 setSize() 方法用來設定視窗元件的大小,程式中設定為 640x480 的像素(Pixel)大小。setDefaultCloseOperation() 用來設定視窗右上角的X按鈕被按下時所該採取的動作,預設是 WindowConstants.HIDE_ONE_CLOSE,也就是按下後隱藏視窗,但並不會結束程式,在這邊希望按下X按鈕後可以直接結束程式,因而設定為 JFrame.EXIT_ON_CLOSE。 +JFrame 擁有一個接受字串引數的建構方法,被設置的字串將用作視窗的標題文字,從 JFrame 繼承下來的 setSize() 方法用來設定視窗元件的大小,程式中設定為 640x480 的像素(Pixel)大小。setDefaultCloseOperation() 用來設定視窗右上角的 X 按鈕被按下時所該採取的動作,預設是 WindowConstants.HIDE_ON_CLOSE,也就是按下後隱藏視窗,但並不會結束程式,在這邊希望按下 X 按鈕後可以直接結束程式,因而設定為 JFrame.EXIT_ON_CLOSE。 在所有的元件與事件處理都設置完成之後,可以使用從 JFrame 繼承下來的 setVisible(),藉由設定其引數為 true 來呈現視窗,程式的執行結果如下圖所示: @@ -350,7 +350,7 @@ public class JNotePadUI extends JFrame { 在 Container 中的元件的位置跟大小是由版面管理員(Layout manager)來決定,當 Container 需要決定它當中的元件的大小或位置時,就會呼叫版面管理員來為其執行。 -- JTextArea 與 JScorllPane +- JTextArea 與 JScrollPane 文字編輯器的基本需求,就是有一個文字編輯區域,這個文字編輯區域可以使用 javax.swing.JTextArea 類別,然而 JTextArea 並不具備捲軸,文字內容多時沒有捲軸對於編輯或瀏覽都不方便,您可以在 JTextArea 上加上一個 javax.swing.JScrollPane,JScrollPane 會檢驗 JTextArea 的文字內容,在必要的時候顯示捲軸,或者是在操作捲軸時,也會對 JTextArea 進行相對應的位置顯示,以下是結合 JTextArea、JScrollPane 以建立文字編輯區域的程式碼片段: @@ -464,7 +464,7 @@ public class JNotePadUI extends JFrame { ## 19.3 事件處理 -當使用者在圖形介面上進行一些操作時,例如移動滑鼠、選取選單項目等,將會引發相關事件(Event)的發生,在 Java 中事件以具體的物件來表示,使用者的相關動作會由JVM建立相對應的事件,用以描述事件來源、發生了什麼事、以及相關的訊息,您要藉由捕捉對應的事件,以進行對應的操作來完成應用程式的功能。 +當使用者在圖形介面上進行一些操作時,例如移動滑鼠、選取選單項目等,將會引發相關事件(Event)的發生,在 Java 中事件以具體的物件來表示,使用者的相關動作會由 JVM 建立相對應的事件,用以描述事件來源、發生了什麼事、以及相關的訊息,您要藉由捕捉對應的事件,以進行對應的操作來完成應用程式的功能。 ### 19.3.1 Java 事件模型 @@ -524,7 +524,7 @@ Java 對事件的處理採委託事件模型(Delegation event model),在 } ); -滑鼠處理者接受的是 MouseEvent,您可以使用 getButton() 方法取得一個常數,表示按下的是哪一個滑鼠鍵,MouseEvent.Button1 是指按下滑鼠左鍵,MouseEvent.Button3 則表示滑鼠右鍵,您使用 JTextArea的addMouseListener() 方法加入傾聽者,程式片段中的 popUpMenu 參考至 javax.swing.JPopupMenu 的實例,這個實例可用編輯選單直接取得,例如: +滑鼠處理者接受的是 MouseEvent,您可以使用 getButton() 方法取得一個常數,表示按下的是哪一個滑鼠鍵,MouseEvent.Button1 是指按下滑鼠左鍵,MouseEvent.Button3 則表示滑鼠右鍵,您使用 JTextArea 的 addMouseListener() 方法加入傾聽者,程式片段中的 popUpMenu 參考至 javax.swing.JPopupMenu 的實例,這個實例可用編輯選單直接取得,例如: JPopupMenu popUpMenu = editMenu.getPopupMenu(); @@ -728,7 +728,7 @@ public class JNotePadUI extends JFrame { ### 19.4.1 開啟檔案的流程處理 -首先定義出當使用者選取選單上的「開啟舊檔」時,所需的處理流程:先檢查目前編輯中的文件是否已儲存,若是,則希望出現對話方塊供使用者選取所需的檔案、開啟它然後顯示在文字編輯區;若否,則出現對話方塊顯示"檔案已修改,是否儲存?"的訊息,若選擇「是」則儲存檔案,若選擇「否」則放棄目前檔案直接開啟舊檔。 +首先定義出當使用者選取選單上的「開啟舊檔」時,所需的處理流程:先檢查目前編輯中的文件是否已儲存,若是,則希望出現對話方塊供使用者選取所需的檔案、開啟它然後顯示在文字編輯區;若否,則出現對話方塊顯示`檔案已修改,是否儲存?`的訊息,若選擇「是」則儲存檔案,若選擇「否」則放棄目前檔案直接開啟舊檔。 上面的流程中,可以分出幾個子流程,例如檢查檔案是否儲存、開啟文件、儲存檔案,這幾個子流程可以先定義為方法,待會再來實作,因此可以先實作出以下的程式內容: @@ -763,7 +763,7 @@ private boolean isCurrentFileSaved() { } ``` -JOptionPane.showConfirmDialog() 可以出現一個訊息對話方塊,設定 JOptionPane.YES_NO_OPTION 會出現「是」、「否」的按鈕,而設定 JOptionPane.WARNING_MESSAGE 會出現一個警告圖示,在確認是否之後,會得到一個 int 常數,與 JOptionPane.YES_OPTION 或 JOptionPane.YES_OPTION 比對,即可得知使用者按下了哪一個按鈕。 +JOptionPane.showConfirmDialog() 可以出現一個訊息對話方塊,設定 JOptionPane.YES_NO_OPTION 會出現「是」、「否」的按鈕,而設定 JOptionPane.WARNING_MESSAGE 會出現一個警告圖示,在確認是否之後,會得到一個 int 常數,與 JOptionPane.YES_OPTION 或 JOptionPane.NO_OPTION 比對,即可得知使用者按下了哪一個按鈕。 ![顯示是否的對話方塊](../images/img19-10.png) @@ -960,7 +960,7 @@ private void processTextArea() { 撰寫 Java 程式到這邊,相信您一定會有所疑問的是,編出來的 .class 檔案越來越多,難道要將這一堆 .class 檔案直接給想要執行程式的人嗎?在 Windows 下的話,有沒有辦法按一下檔案,就可以執行程式呢? -當然,實際上要交付程式時,並不是給一堆 .class 檔案,而是會將編譯好的 .class 檔包裝為一個J ava Archive File,也就是副檔名為 .jar 的檔案,在 JDK 的 bin 目錄下,附帶有一個 jar 工具程式,您可以直接執行 jar 程式,看看它的提示訊息: +當然,實際上要交付程式時,並不是給一堆 .class 檔案,而是會將編譯好的 .class 檔包裝為一個 Java Archive File,也就是副檔名為 .jar 的檔案,在 JDK 的 bin 目錄下,附帶有一個 jar 工具程式,您可以直接執行 jar 程式,看看它的提示訊息: ![執行 jar 工具程式](../images/img19-13.png) @@ -972,7 +972,7 @@ private void processTextArea() { 圖 19.14 準備製作 jar 檔案 -接著開啟文字模式,切換工作目錄至 jar 目錄下,然後鍵入以下的指令,表示將建立一個 JNotePad.jar 放到 bin 目錄中,來源是 classes 中的檔案,被放入的檔案將以 / 作為 .jar 檔案中的根目錄: +接著開啟文字模式,切換工作目錄至 jar 目錄下,然後鍵入以下的指令,表示將建立一個 JNotePad.jar 放到 bin 目錄中,來源是 classes 中的檔案,被放入的檔案將以 `/` 作為 .jar 檔案中的根目錄: ![製作 jar 檔案](../images/img19-15.png) @@ -985,7 +985,7 @@ private void processTextArea() { 接著您的文字編輯器就會啟動了,現在您不用將一堆 .class 檔案交付出去,只要交付這個 JNotePad.jar 就可以了。 -然而,真的要指定 Classpath 這麼麻煩嗎?其實還有更方便的做法,製作一 個Executable Jar 檔案,指定讀取 .jar 檔案時要執行的 Main-Class 就可以了,這需要準備一個 manifest.txt,當中寫下: +然而,真的要指定 Classpath 這麼麻煩嗎?其實還有更方便的做法,製作一個 Executable Jar 檔案,指定讀取 .jar 檔案時要執行的 Main-Class 就可以了,這需要準備一個 manifest.txt,當中寫下: ![準備 manifest 檔案](../images/img19-16.png) @@ -997,7 +997,7 @@ private void processTextArea() { 圖 19.17 指定 manifest 檔案並製作 jar 檔案 -在 .jar 檔案製作出來後,您可以在執行 java 時指定 -jar 引數,以及您的 .jar 檔案,java 程式會自動尋找 Main-Clas s並執行,例如下達以下的指令: +在 .jar 檔案製作出來後,您可以在執行 java 時指定 -jar 引數,以及您的 .jar 檔案,java 程式會自動尋找 Main-Class 並執行,例如下達以下的指令: java -jar bin/JNotePad.jar diff --git a/docs/CH20.md b/docs/CH20.md index ba162f9..d194528 100644 --- a/docs/CH20.md +++ b/docs/CH20.md @@ -776,7 +776,7 @@ conn.rollback(savepoint); . . . conn.commit(); // 記得釋放save point -stmt.releaseSavepoint(savepoint); +conn.releaseSavepoint(savepoint); ``` > **良葛格的話匣子** 您的資料表格必須支援交易,才可以執行以上所提到的功能,例如在 MySQL 中可以建立 InnoDB 類型的表格: