字體:小 中 大 | |
|
||||||||||||||||||||||||
2021/06/14 17:33:08瀏覽3570|回應0|推薦0 | ||||||||||||||||||||||||
1. 程式館的基本概念 如果程式的開發都必須從零開始,一針一線親力親為,那麼程式的開發便無效率可言。所有的程式必需處理較為低階的工作,像是輸入與輸出、系統中斷或是例外處理、常用模組的撰寫等。因此程式開發者需要花費較多的時間學會這些低階模組的撰寫。除了要克服這些基本的功能之外,許多軟體開發的優點也都無法實現,像是軟體再使用與共享模組或元件。 為了要達到前述的優點與功能,多數的程式語言都提供程式館(library)。將常用、低階或特定功能的模組,在語言發行的同時便完成程式庫的提供。因此所有的程式開發人員都可以共享此程式館中的模組。不同程式語言對程式館的稱呼不一,稱之為函式庫、程序庫或程式館,但是其功能則是相同的。 Java語言中的程式館叫做套件 (package)。我們在撰寫Java程式時,經常需要參考各個套件中的類別與介面,藉此可以簡化程式的開發工作。 套 件: Java 語言中的「套件」是由一群相關的類別與介面所組成。 如果沒有套件的機制,我們所看到的程式或是系統,將是一堆難以估算的類別與介面,讓我們無法知道整個程式或是系統的結構。 有了套件之後我們便可以依照功能用途,將相關的類別或介面組合成套件,在使用、參考與維護上都更為簡潔與方便。 同時,可以提高軟體元件或模組的重複使用。 自己建立套件x.y.z 和使用套件 建立套件x.y.z package x.y.z; //建立套件 x.y.z import java.util.Scanner; //輸入java套件util中的Scanner public class Input { static Scanner sc = new Scanner(System.in); //建立靜態物件sc public static boolean keyinYorN(String msg) { while(true) { String instr; System.out.print("\n" + msg + " (Y[y] or N[n])"); instr = sc.next(); if(instr.equalsIgnoreCase("Y")) //忽略大小寫 return true; else if(instr.equalsIgnoreCase("N")) return false; } } } 使用自己建立的套件 import x.y.z.Input; public class PackageTest { public static void main(String[] args) { while(Input.keyinYorN("繼續輸入嗎?")) { System.out.print("是(Y/y)..."); } } } 繼續輸入嗎?(Y[y] or N[n])y 是(Y/y)... 繼續輸入嗎?(Y[y] or N[n])n 下載安裝函式庫文件 1. download jdk-6u10-docs.zip, 解壓縮再放入OS(C):>Program Files>eclipse>docs目錄底下 7-2 輸入與輸出程式館 一般在撰寫程式時,經常需要使用到「輸入」與「輸出」的功能。 「輸入」可以在程式執行時從外界輸入設備讀取資料,常見的輸入設備有鍵盤與滑鼠。 「輸出」可以用來顯示程式執行中的變數值以及執行結果,常用的輸出設備為螢幕與印表機。 常用的輸入與輸出的方法,包含「控制台輸入與輸出」、「對話框式輸入與輸出」與「檔案輸入與輸出」。 控制台輸入與輸出: 我們可以經由標準輸入串流物件 (standard input stream object)System.in,從標準輸入設備鍵盤輸入資料到變數中。 標準輸入串流輸入的資料格式是一串的字元, System.in 物件從輸入串流中擷取位元組。 因此在使用System.in 之前,要先建立從輸入串流讀取字元的輸入串流物件。 為了讓使用者能夠更容易開發程式,JDK在程式館中提供許多常用或基礎的程式碼,我們只要學習如何使用即可。 底下是從標準輸入串流中讀取一個字元的程式片段: InputStreamReader charReader = new InputStreamReader(System.in); 當程式執行到此指令時,可以從標準輸入串流讀取一個字元,並且將這個字元存放在讀取輸入串流物件charReader 中。 如果要讀取整行的輸入,則需要使用到讀取緩衝區類別 BufferedReader,其程式片段如下: BufferedReader input = new BufferedReader(charReader); 前面所提到的InputStreamReader與 BufferedReader為串流類別,提供程式所需要的輸入資料。 charReader與input物件稱之為輸入串流物件。 有了這些程式片段之後,便可以很方便的從標準輸入取得資料。 另外,在輸入時需要留意的是Java 的輸入只可以是字元或是字串。 因此在輸入是數值時,是沒有辦法計算的,必需先將字串轉換成數值,才可以使用各種運算。 在Java中的標準輸出設備是使用標準輸出物件System.out來達成的。 此物件可以使用print 與println方法,將指定的字串顯示在輸出設備上。 兩個方法的區別是後者在輸出完畢後游標會跳到下一行首。此二方法的格式如下: System.out.print(StringExp); System.out.println(StringExp); 其中StringExp 為字串表示式,多於一個以上的項目要顯示時,可以使用加號(+)將要顯示的項目串接在一起。 串接的字串當中可以使用跳脫字元來控制跳行、跳位或印表機的跳頁。 import java.io.BufferedReader; //宣告引用程式的類別與套件 import java.io.InputStreamReader; public class IOTest1 { public static void main(String[] argv) throws Exception { //處理例外 String temp; int[] values = new int[3]; //宣告整數陣列,陣列有3個整數 double sum = 0.0; InputStreamReader charreader = new InputStreamReader(System.in); //宣告物件charreader引用標準輸入串流 System.in物件輸入字元 BufferedReader input = new BufferedReader(charreader); //BufferedReader用於整行字串的輸入 System.out.print("請輸入你的名字: "); String name = input.readLine(); //name物件從input緩衝區讀取一行字串 System.out.println("喂, " + name + ". 請輸入三個整數..."); for (int i = 0; i < values.length; i++) { System.out.print("數字 " + (i + 1) + ": "); temp = input.readLine(); values[i] = Integer.parseInt(temp); sum += values[i]; } System.out.println("平均值為: " + sum / values.length); } } 請輸入你的名字: ben 喂, ben. 請輸入三個整數... 數字 1: 68 數字 2: 90 數字 3: 42 平均值為: 66.66666666666667 對話框式輸入與輸出: 控制台輸入與輸出是最簡易的輸入與輸出方式,在UNIX環境下是在錢號($)或井號(#)的提示字元下,在 Windows環境下則是命令提示字元的模式下進行。 在本節中我們要介紹的輸入與輸出方法,是在程式的執行中遇到需要輸入資料或是輸出時,以彈出對話框方式讓使用者輸入資料,或是以訊息框來顯示要輸出的訊息。 為了要使用對話框的方式輸入與輸出,需要使用到 Swing中的 JOptionPane套件。 showInputDialog方法可以用來顯示參數所指定的訊息。 程式在執行時會顯示訊息框,以便輸入兩個整數字串。 最後,使用showMessageDialog方法,將加總的結果顯示在對話框中。 // 對話框輸入與輸出範例 import javax.swing.JOptionPane; public class IOTest2 { public static void main (String[] args) throws Exception { String intString1; // 存放使用者輸入的第一個整數字串 String intString2; // 存放使用者輸入的第二個整數字串 int int1; // 整數1 int int2; // 整數2 int sum; // 存放總和 // 讀入第一個整數字串 intString1 = JOptionPane.showInputDialog( "請輸入第一個整數" ); // 讀入第二個整數字串 intString2 = JOptionPane.showInputDialog( "請輸入第二個整數" ); // 將整數字串轉換成整數數字 int1 = Integer.parseInt( intString1 ); int2 = Integer.parseInt( intString2 ); // 加總運算 sum = int1 + int2; // 顯示加總結果 JOptionPane.showMessageDialog( null, "總和為: " + sum, "結果", JOptionPane.PLAIN_MESSAGE ); System.exit(0); } } 檔案輸入與輸出: 在大量的輸入資料,或是希望在程式的執行期間,不要盯著螢幕看是否需要輸入資料。 我們可以運用檔案的輸入與輸出,來達成前述功能 。 程式首先建立緩衝讀取器BufferedReader物件 inFile。 接著建立列印寫入器 PrintWriter物件outFile,分別當做輸入與輸出檔案。 檔案的名稱是經由檔案讀取器 FileReader建構子來指定,輸入檔案的名稱為testin.txt,輸出檔案的名稱為testout.txt。 讀取檔案時是經由readLine方法,在迴圈中逐一讀取檔案中的資料。 讀出的資料存放在字串變數 datarecord中,當字串為null時表示已經讀取完畢,便會結束迴圈的執行 // 檔案的輸入與輸出範例 // TestFileInput.java import java.io.*; //引用輸出入套件 import java.util.*; //分解字串用的套件,tokenizer public class IOTest3 { public static void main (String[] args) throws Exception { int i, x1, x2, x3, record=0; int avg, sum; String datarecord, name; StringTokenizer tokenizer; //以空格分解字串 // 建立輸入檔案 BufferedReader inFile = new BufferedReader(new FileReader("testin.txt")); // 建立輸出檔案 PrintWriter outFile = new PrintWriter(new FileWriter("testout.txt")); // 檔案處理迴路 while ( (datarecord = inFile.readLine()) != null) { // 將讀入的資料記錄, 分解成欄位 tokenizer = new StringTokenizer(datarecord); // 取得下一個欄位 name = tokenizer.nextToken(); // 將分數的欄位轉換成整數 x1 = Integer.parseInt(tokenizer.nextToken()); x2 = Integer.parseInt(tokenizer.nextToken()); x3 = Integer.parseInt(tokenizer.nextToken()); sum = x1 + x2 + x3; avg = sum / 3; // 寫入檔案 outFile.print(name + " "); outFile.println(x1 + " " + x2 + " " + x3 + " " + sum + " " + avg); // 從螢幕顯示寫入檔案的資料 System.out.println("寫入第 " + (++record) + " 筆資料錄" ); System.out.print(name + " "); System.out.println("\t" + x1 + " " + x2 + " " + x3 + " " + sum + " " + avg); }; // 關閉檔案 outFile.close(); inFile.close(); } } 寫入第 1 筆資料錄 Peter 76 58 56 190 63 寫入第 2 筆資料錄 Jack 56 43 89 188 62 寫入第 3 筆資料錄 Mary 36 27 93 156 52 7-3 字串程式館 字串程式館簡介(1): 由字元所組成的一串文字符號,稱之為字串。 在 Java 中字串可以使用 String 類別來建立,例如您可以使用以下的方式來宣告並初始化一個字串變數: String str = "Java程式語言"; 注意字串的直接指定必須使用英文字的雙引號。 而字串是使用 Unicode 字元來建構,在建構一個字串物件變數之後,您可以直接在輸出串流中指定變數名稱來輸出字串,例如: System.out.println(str); 字串的串接在Java 中可以直接使用+運算子。 + 本來是加法運算子,而它被重載(Override)為可以直接用於字串的串接,例如您可以這麼使用字串: String str1 = "Hi, "; str1 = str1 + "Java Language."; System.out.println(str1); 這一段程式碼執行時會顯示。 "Hi, Java Language." String 類別的基本方法 原始資料型態類別提供的剖析方法 其他String 類別的方法(1) 其他String 類別的方法(2) 範例一 public class StringDemo1 { public static void main(String[] args) { String str = "Java"; System.out.println("字串內容: " + str ); System.out.println("字串長度: " + str.length()); System.out.println("等於java? " + str.equals("java")); System.out.println("轉為大寫: " + str.toUpperCase()); System.out.println("轉為小寫: " + str.toLowerCase()); } } 字串內容: Java 字串長度: 4 等於java? false 轉為大寫: JAVA 轉為小寫: java 範例二 public class StringDemo2 { public static void main(String[] args) { String str = "Learn to program Java programming language.\n"; System.out.println("字串內容: "); for(int i = 0; i < str.length(); i++) System.out.print(str.charAt(i)); System.out.println("\n第一個program: " + str.indexOf("program")); System.out.println("最後一個program: " + str.lastIndexOf("program")); char[] charArray = str.toCharArray(); System.out.println("\n字元陣列charArray內容: "); for(int i = 0; i < charArray.length; i++) System.out.print(charArray[i]); } } 字串內容: Learn to program Java programming language. 第一個program: 9 最後一個program: 22 字元陣列charArray內容: Learn to program Java programming language. 範例三 public class StringDemo3 { public static void main(String args[]) { String str[] = { "wished", "wishing", "helped", "helping" }; for ( int count = 0; count < str.length; count++ ) if ( str[ count ].startsWith( "wi" ) ) System.out.println("\"" + str[ count ] + "\" 字串開頭是 \"wi\""); System.out.println(); for ( int count = 0; count < str.length; count++ ) if ( str[ count ].startsWith( "sh", 2 ) ) System.out.println("\"" + str[ count ] + "\" 字串在位置 2開頭是 \"sh\""); System.out.println(); for ( int count = 0; count < str.length; count++ ) if ( str[ count ].endsWith( "ed" ) ) System.out.println("\"" + str[ count ] + "\" 字串結尾是 \"ed\""); } } "wished" 字串開頭是 "wi" "wishing" 字串開頭是 "wi" "wished" 字串在位置 2開頭是 "sh" "wishing" 字串在位置 2開頭是 "sh" "wished" 字串結尾是 "ed" "helped" 字串結尾是 "ed" 7-3-5 StringBuffer 與StringBuilder 類別簡介 String 類別: 雖然String 類別提供許多功能很強的方法。 但是對於需要吃重處理字串的應用而言,確實不夠有效率。 原因在於字串類別所建立的物件是不可變動的 (immutable),建立了字串之後就無法改變其長度。 任何方法在使用到字串時,都會建立一個新的字串物件,接著把字串複製到此新建立的字串物件,然後才進行物件的各種處理功能。 如果程式包含了大量的此類的處理時,效率便會大打折扣。 String 類別例子 一個字串類別的例子, int counter = 3; String str = "There are "; String str += counter; String str += " oranges on the desk. "; String 類別例子解說: “There are ”字串:第二行指令需要建立的字串,建立好字串後將字串的參考位置傳送給str字串變數。 “3”字串:因為第三行的字串串接使用到整數,因此會呼叫 counter.toString()方法,將數字counter轉為字串“3”。 "There are 3" 字串:第三行執行的結果,在第一個字串之後串接第二個字串,建立好字串後將字串的參考位置傳送給str字串變數。“ oranges on the desk.”字串:建立第四行程式所需要的字串。 “ There are 3 oranges on the desk.”字串:第四行執行的結果,在第三個字串之後串接第四個字串,建立好字串後將字串的參考位置傳送給str字串變數。 StringBuffer類別: 每個字串緩衝區 (StringBuffer)都有一定的容量。 只要字串緩衝區所包含的字串長度沒有超出此容量,就無需再分配新的內部緩衝區陣列。 如果內部緩衝區溢位,則此字串容量會自動增大。 StringBuilder類別: StringBuilder類別是一個可變長度的字串。 該類別被設計用來當作StringBuffer的一個簡易替換,用在字串緩衝區被單一執行緒使用的時候。 如果可能,建議優先採用該類別,因為在大多數程式的實作中,它比StringBuffer要快。 每個StringBuilder都有一定的容量,只要StringBuilder 所包含的字串長度沒有超出此容量,就無需分配新的內部緩衝區。 如果內部緩衝區溢位,則此容量自動增大。 7-3-6 StringBuffer與StringBuilder提供的方法 範例一 public class StringBufferDemo1 { public static void main( String args[] ) { StringBuffer strbuf1 = new StringBuffer(); //()表示空字串 StringBuffer strbuf2 = new StringBuffer(12); //(12)無字串,也是空字串 StringBuffer strbuf3 = new StringBuffer("Java"); System.out.println("字串1: " + strbuf1.toString()); System.out.println("字串2: " + strbuf2.toString()); System.out.println("字串3: " + strbuf3.toString()); } } 字串1: 字串2: 字串3: Java 範例二 public class StringBufferDemo2 { public static void main( String args[] ) { StringBuffer buf = new StringBuffer("Java Language"); System.out.println("字串"+buf.toString()+"的長度為: "+buf.length()+ ", 容量為: "+buf.capacity()); buf.ensureCapacity( 25 ); System.out.println("執行ensureCapacity(25)後, 容量為: "+buf.capacity()); buf.ensureCapacity( 50 ); System.out.println("執行ensureCapacity(50)後, 容量為: "+buf.capacity()); buf.setLength(8); System.out.println("執行setLength(8)後; 長度為: "+buf.length()+ ", 字串變為: "+buf.toString()); } } 字串Java Language的長度為: 13, 容量為: 29 //長度+16byte=29 執行ensureCapacity(25)後, 容量為: 29 執行ensureCapacity(50)後, 容量為: 60 //29*2+2byte=60 執行setLength(8)後; 長度為: 8, 字串變為: Java Lan 範例三 public class StringBufferDemo3 { public static void main(String args[]) { StringBuffer buf = new StringBuffer("Java Language"); System.out.println("字串buf內容為: "+buf.toString()); System.out.println("字串位置0的字元為: "+buf.charAt(0)); System.out.println("字串位置5的字元為: "+buf.charAt(5)); System.out.println(); char charArray[] = new char[ buf.length() ]; buf.getChars( 0, buf.length(), charArray, 0 ); System.out.println("使用getChars方法將字串填入字元陣列後的內容:"); for ( int count = 0; count < charArray.length; ++count ) System.out.print(charArray[ count ]); System.out.println("\n"); buf.setCharAt( 0, G ); buf.setCharAt( 5, P ); System.out.println("位置0的字元改成G,位置5的字元改成P:"); System.out.println(buf.toString()); System.out.println(); buf.reverse(); System.out.println("將字元順序反轉之後:"); System.out.println(buf.toString()); } } 使用getChars方法將字串填入字元陣列後的內容: Java Language 位置0的字元改成G,位置5的字元改成P: Gava Panguage 將字元順序反轉之後: egaugnaP avaG 範例四 public class StringBufferDemo4 { public static void main(String args[]) { Object objectRef = "展示"; String string = "字串append功能"; char charArray[] = {a, b, c, d}; boolean booleanValue = true; char characterValue = Y; int integerValue = 8; long longValue = 1234567; float floatValue = 3.14f; double doubleValue = 2.71828; StringBuffer lastBuffer = new StringBuffer("last StringBuffer"); StringBuffer buf = new StringBuffer(); buf.append(objectRef); buf.append("\n"); buf.append(string); buf.append("\n"); buf.append(charArray); buf.append("\n"); buf.append(charArray, 0, 3); buf.append("\n"); buf.append(booleanValue); buf.append("\n"); buf.append(characterValue); buf.append("\n"); buf.append(integerValue); buf.append("\n"); buf.append(longValue); buf.append("\n"); buf.append(floatValue); buf.append("\n"); buf.append(doubleValue); buf.append("\n"); buf.append(lastBuffer); System.out.println(buf); } } 展示 字串append功能 abcd abc true Y 8 1234567 3.14 2.71828 last StringBuffer 範例五 public class StringBufferDemo5 { public static void main(String args[]) { Object objectRef = "展示"; String string = "字串insert, delete功能"; char charArray[] = {a, b, c, d}; boolean booleanValue = true; char characterValue = Y; int integerValue = 8; long longValue = 1234567; float floatValue = 3.14f; double doubleValue = 2.71828; StringBuffer buf = new StringBuffer(); buf.insert( 0, objectRef ); buf.insert( 0, "\n" ); buf.insert( 0, string ); buf.insert( 0, "\n" ); buf.insert( 0, charArray ); buf.insert( 0, "\n" ); buf.insert( 0, charArray, 1, 2 ); buf.insert( 0, "\n" ); buf.insert( 0, booleanValue ); buf.insert( 0, "\n" ); buf.insert( 0, characterValue ); buf.insert( 0, "\n" ); buf.insert( 0, integerValue ); buf.insert( 0, "\n" ); buf.insert( 0, longValue ); buf.insert( 0, "\n" ); buf.insert( 0, floatValue ); buf.insert( 0, "\n" ); buf.insert( 0, doubleValue ); System.out.println("插入後的內容:\n"+buf+"\n"); buf.deleteCharAt( 10 ); buf.delete( 2, 6 ); System.out.println("執行deleteCharAt(10)與delete(2,6)後的內容:\n"+buf); } } 插入後的內容: 2.71828 3.14 1234567 8 Y true bc abcd 字串insert, delete功能 展示 執行deleteCharAt(10)與delete(2,6)後的內容: 2.8 3.4 1234567 8 Y true bc abcd 字串insert, delete功能 展示 範例六 StringBuffer改為StringBuilder public class StringBuilderDemo2 { public static void main( String args[] ) { StringBuilder buf = new StringBuilder("Java Language"); System.out.println("字串"+buf.toString()+"的長度為: "+buf.length()+ ", 容量為: "+buf.capacity()); buf.ensureCapacity( 25 ); System.out.println("執行ensureCapacity(25)後, 容量為: "+buf.capacity()); buf.ensureCapacity( 50 ); System.out.println("執行ensureCapacity(50)後, 容量為: "+buf.capacity()); buf.setLength(8); System.out.println("執行setLength(8)後; 長度為: "+buf.length()+ ", 字串變為: "+buf.toString()); } } 字串Java Language的長度為: 13, 容量為: 29 //長度+16byte=29 執行ensureCapacity(25)後, 容量為: 29 執行ensureCapacity(50)後, 容量為: 60 //29*2+2byte=60 執行setLength(8)後; 長度為: 8, 字串變為: Java Lan JLabel import java.awt.*; import javax.swing.*; public class JLabelDemo { public static void main(String[] args) { JLabel label = new JLabel(); label.setFont(new Font("SimSun",Font.PLAIN, 12)); label.setText("Hello world! - 測試標籤"); JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(label); f.setSize(200, 70); f.setVisible(true); } } JButton import java.awt.*; import javax.swing.*; public class JButtonDemo { public static void main(String[] args) { JFrame f = new JFrame("我的按鍵"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton b = new JButton(new ImageIcon("Bird.gif")); f.getContentPane().add(b); f.setSize(280, 220); f.setVisible(true); } } JTextField import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JTextFieldDemo extends JFrame { private JTextField txtfld1, txtfld2; private JPasswordField pwfld; public JTextFieldDemo() { super("測試文字欄位與密碼欄位" ); Container container = getContentPane(); container.setLayout( new FlowLayout() ); // 建立長度為10的文字欄位txtfld1, 以add方法將文字欄位加入到容器 txtfld1 = new JTextField( 10 ); container.add( txtfld1 ); // 建立文字欄位txtfld2, 其內容為"不可編輯欄位", 長渡為 20 // 以add方法將文字欄位加入到容器中 txtfld2 = new JTextField("不可編輯欄位", 20); txtfld2.setEditable( false ); container.add( txtfld2 ); // 建立密碼文字欄位pwfld, 其內容為"隱藏文字", pwfld = new JPasswordField("abcdefgh"); container.add( pwfld ); // 註冊事件處理程式 TextFieldHandler handler = new TextFieldHandler(); txtfld1.addActionListener( handler ); txtfld2.addActionListener( handler ); pwfld.addActionListener( handler ); setSize( 325, 120 ); setVisible( true ); } public static void main( String args[] ) { JTextFieldDemo application = new JTextFieldDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } // 定義處理事件之內部類別 private class TextFieldHandler implements ActionListener { // 處理文字欄位的事件 public void actionPerformed( ActionEvent event ) { String string = ""; // 處理文字欄位1使用者按Enter鍵 if ( event.getSource() == txtfld1 ) string = "txtfld1: " + event.getActionCommand(); // 處理文字欄位2使用者按Enter鍵 else if ( event.getSource() == txtfld2 ) string = "txtfld2: " + event.getActionCommand(); // 處理密碼欄位使用者按Enter鍵 else if ( event.getSource() == pwfld ) { string = "pwfld: " + new String( pwfld.getPassword() ); } JOptionPane.showMessageDialog( null, string ); } } } 7-4 其他程式館(對任何一種程式語言而言,程式館都非常重要,比較低階的操作或是功能,都在程式館之中因此可以降低程式開發的困難度,進而提升生產力。除此之外,也可以達到軟體元件共享與再使用的目的) GUI圖形化使用者介面類別簡介 圖形化使用者介面(Graphical User Interface,GUI)。 不論在Windows或UNIX的視窗環境下,畫面上所呈現的視窗或桌面便是典型的圖形化介面。 我們可以將它定義成按下的按鈕、輸入文字的欄位、開啟和關閉的視窗等等,這些都是GUI的元素。 還有更多都是GUI元素,比如滑鼠、鍵盤、音量、螢幕顏色、使用的字體等等。 實際上,在電腦和使用者的互動之中扮演角色的任何物件都是GUI的組成元件。 Swing簡介: Swing 是Java 平臺的GUI,它是用來處理使用者與電腦之間互動的程式庫。 Swing 提供了處理GUI元件的機制,並且提供了建立 GUI所需要的工具。 以下便是幾個簡單的例子: 鍵盤: Swing 提供了擷取使用者輸入的方法 顏色: Swing 提供改變在螢幕上看到的顏色的方法 輸入文字的欄位: Swing 提供了文字輸入元件,可以互動的讀取使用者的輸入 Swing在基本的GUI之上又建立了一個設計模式,叫做 「模式視圖控制器(Model-View-Controller, MVC)」 。 它試圖將軟體設計中不同的角色分開。 MVC讓負責顯示的程式碼、處理資料的程式碼、對互動進行回應並驅動變化的程式碼彼此分離。 因此MVC設計模式背後的概念是讓GUI的每個部分處理它擅長的工作。 Swing元件庫的基礎為JComponent,它是所有元件的父類別。 它是一個抽象類別,所以不能建立JComponent物件,它包含了數百個方法。 JComponent不僅是Swing元件的基礎類別,還是元件畫面呈現的基礎類別。 它是所有元件繪製的基礎架構,提供一些方便進行元件設定的方法。 它知道如何處理所有的鍵盤按鍵,所以類別只需要偵測特定的按鍵。 我們可以把任意 Swing元件添加到其他的 Swing元件,例如:JP anel包含JLabel、JTextField, JMenu包含 Jlabel、 JList、 JButton、 JRadioBox等。 Jlabel: 使用JLabel標籤類別,我們可以顯示無法以滑鼠選取的文字與影像。 擴充或繼承這個類別,可以建立用來顯示字串、影像,或者是同時具有文字與影像的元件。 實際上,我們不僅把JLabel當做文字描述,還將它當作圖片描述。 在Swing 應用程式中看到的圖片,有可能就是JLabel。 其基本的方法包括設置文字、圖片、對齊以及標籤描述的其他元件。 Jbutton: 除了基本的方法之外, JButton 還包含另外一組方法,這些方法可以利用按鈕的狀態。 狀態是對元件進行描述的一個屬性,通常採用真/假設置。 在 JButton 中,可以包含以下可能狀態: 活動/不活動、選中/沒選中、滑鼠經過/滑鼠離開、按下/沒按下等等 另外,可以組合這些狀態,例如按鈕可以在滑鼠經過的同時被選中。 JtextField/JPasswordField: 文字欄位可以用來顯示單行的文字訊息或是文字輸入,文字是經由鍵盤輸入。 JPasswordField一樣可以輸入單行資料,但是在輸入文字時不會真正顯示該文字。 是以星號代替您輸入的字元,通常用來作為密碼的輸入欄位。 當使用者在輸入完資料後按「Enter」鍵時,便會產生行動事件 (action event) 。 如果程式有註冊事件監聽程式 (event listener),監聽程式便可以處理該事件,因此程式便可以取得使用者輸入的資料。 JcheckBox/JRadioButton: JCheckBox和JRadioButton元件都可以用來呈現選項,通常採用多選的格式。 從實作的角度來說,它們沒有那麼不同,它們的行為方式相同。 JRadioButton通常組合在一起,向使用者呈現帶有必選答案的問題,而且這些答案具有強制性,這意味著問題只能有一個答案。 一旦選擇了JRadioButton,就不能取消對它的選擇, 除非選擇了在同一組中的另外一個單選按鈕。 從效果上看,這就保證了選項的惟一和必選。 JCheckBox的不同在於允許隨機地選擇/取消除選擇,並允許選擇多個選項。 範例一 import javax.swing.*; //java擴充程式庫中swing套件的所有類別與介面
public class SwingDemo1 {
public static void main(String[] args) {
JFrame f = new JFrame("Hello Swing!");
f.setVisible(true);
}
}
範例二 import java.awt.*; //抽象視窗套件引入 import javax.swing.*; public class SwingDemo2 { public static void main(String[] args) { MyJFrame f = new MyJFrame(); f.setTitle("Drawing Graphics in Frames"); //對話框標題設定 f.setBounds(100,50,500,300); //對話框大小設定(起點x座標,起點y座標,長,高) f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } static class MyJFrame extends JFrame { //繼承JFrame類別 public void paint(Graphics g) { //改寫paint方法的g物件 g.drawRect(20,10,100,60); //設定drawDect(起點x座標,起點y座標,長,高) } } } 範例三 import java.awt.*; import javax.swing.*; public class SwingDemo3 { public static void main(String[] args) { JFrame f = new JFrame(); f.setTitle("Drawing Graphics in a Frame" +" by Adding a Component"); f.setBounds(100,50,500,300); f.getContentPane().add(new MyComponent()); // f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } static class MyComponent extends JComponent { //繼承JComponent類別 public void paint(Graphics g) { g.drawRect(20,10,100,60); } } } 範例四 import java.awt.*; import javax.swing.*; public class SwingDemo4 { public static void main(String[] args) { JFrame f = new JFrame(); f.setTitle("Drawing Graphics in a Frame"+ " by Replacing the Content Pane"); f.setBounds(100,50,500,300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setContentPane(new MyComponent()); f.setVisible(true); } static class MyComponent extends JComponent { public void paint(Graphics g) { g.drawRect(20,10,100,60); } } } Math類別簡介 我們在撰寫Java的應用程式時,經常會碰到需要使用數學計算的函數。 在Java的Math類別中提供相當多的數學方法,可以提供給我們使用。 常用的數學函數方法 (1)
常用的數學函數方法(2) 三角函數sin、cos、tan、cot、sec、csc 反三角函數asin、acos、atan、acot、asec、acsc 雙曲線函數sinh、cosh /* 測試算數類別的範例1 */ public class TestMath1 { public static void main(String args[]) { double value1; int i1,i2; value1 = 3.4; System.out.println(value1+" 的四捨五入值為 " + Math.round(value1)); value1 = -3.4; System.out.println(value1+" 的絕對值為 "+Math.abs(value1)); value1 = 3.4; System.out.println(value1+" 的ceil函數值為 "+Math.ceil(value1)); value1 = 3.4; System.out.println(value1+" 的floor函數值為 "+Math.floor(value1)); value1 = 16; System.out.println(value1+" 的平方根為 "+Math.sqrt(value1)); i1 = 2; i2=6; System.out.println(i1+" 的 " + i2 + " 次方之值為 "+ (int) Math.pow(i1,i2)); } } 3.4 的四捨五入值為 3 -3.4 的絕對值為 3.4 3.4 的ceil函數值為 4.0 3.4 的floor函數值為 3.0 16.0 的平方根為 4.0 2 的 6 次方之值為 64 /* 測試算數類別的範例2 */ public class TestMath2 { public static void main(String args[]) { double value, degree, radian; value = 10; System.out.println(value+" 的自然對數函數值為 "+ Math.log(value)); value = 2; System.out.println("自然指數函數的 "+value+" 次方為 "+ Math.exp(value)); degree = 0; radian = Math.PI * degree / 180; System.out.println((int) degree+" 度的正弦函數值為 "+ Math.sin(radian)); degree = 90; radian = Math.PI * degree / 180; System.out.println((int) degree+" 度的正弦函數值為 "+ Math.sin(radian)); value = 1; radian = Math.asin(value); degree = radian * 180 / Math.PI; System.out.println(value+" 的反正弦函數值為 "+degree+" 度"); } } 10.0 的自然對數函數值為 2.302585092994046 自然指數函數的 2.0 次方為 7.38905609893065 0 度的正弦函數值為 0.0 90 度的正弦函數值為 1.0 1.0 的反正弦函數值為 90.0 度 |
||||||||||||||||||||||||
( 知識學習|隨堂筆記 ) |