-
認識程式館的基本概念。
-
學習如何閱讀JDK的API文件。
-
認識JDK常用的程式庫。
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 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)
-
方法名稱
功能
round
求得double數值的四捨五入
abs
取得float或double的絕對值
ceil
取得大於該數的最小整數
floor
取得小於該數的最大整數
max
傳回兩數之較大者
min
傳回兩數之較小者
sqrt
計算開平方
pow
計算某一數值n的m次方
random
隨機產生在0與1之開區間中的數值
exp
計算自然指數(以e為底數) 函數值
log
計算自然對數函數值
常用的數學函數方法(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 度