網路城邦
上一篇 回創作列表 下一篇   字體:
第七章 Java的程式館(library):常用的函式
2021/06/14 17:33:08瀏覽3570|回應0|推薦0

  • 認識程式館的基本概念。

  • 學習如何閱讀JDKAPI文件。

  • 認識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);

前面所提到的InputStreamReaderBufferedReader為串流類別,提供程式所需要的輸入資料。 charReaderinput物件稱之為輸入串流物件。 有了這些程式片段之後,便可以很方便的從標準輸入取得資料。 另外,在輸入時需要留意的是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 StringBufferStringBuilder提供的方法

範例一

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 InterfaceGUI)。 不論在WindowsUNIX的視窗環境下,畫面上所呈現的視窗或桌面便是典型的圖形化介面。 我們可以將它定義成按下的按鈕、輸入文字的欄位、開啟和關閉的視窗等等,這些都是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包含JLabelJTextField, JMenu包含 JlabelJListJButtonJRadioBox等。

Jlabel: 使用JLabel標籤類別,我們可以顯示無法以滑鼠選取的文字與影像。 擴充或繼承這個類別,可以建立用來顯示字串、影像,或者是同時具有文字與影像的元件。 實際上,我們不僅把JLabel當做文字描述,還將它當作圖片描述。 在Swing 應用程式中看到的圖片,有可能就是JLabel。 其基本的方法包括設置文字、圖片、對齊以及標籤描述的其他元件。

Jbutton: 除了基本的方法之外, JButton 還包含另外一組方法,這些方法可以利用按鈕的狀態。 狀態是對元件進行描述的一個屬性,通常採用真/假設置。 在 JButton ,可以包含以下可能狀態: 活動/不活動、選中/沒選中、滑鼠經過/滑鼠離開、按下/沒按下等等 另外,可以組合這些狀態,例如按鈕可以在滑鼠經過的同時被選中。

JtextField/JPasswordField: 文字欄位可以用來顯示單行的文字訊息或是文字輸入,文字是經由鍵盤輸入。 JPasswordField一樣可以輸入單行資料,但是在輸入文字時不會真正顯示該文字。 是以星號代替您輸入的字元,通常用來作為密碼的輸入欄位。 當使用者在輸入完資料後按「Enter」鍵時,便會產生行動事件 (action event) 。 如果程式有註冊事件監聽程式 (event listener),監聽程式便可以處理該事件,因此程式便可以取得使用者輸入的資料。

JcheckBox/JRadioButton: JCheckBoxJRadioButton元件都可以用來呈現選項,通常採用多選的格式。 從實作的角度來說,它們沒有那麼不同,它們的行為方式相同。 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的應用程式時,經常會碰到需要使用數學計算的函數。 在JavaMath類別中提供相當多的數學方法,可以提供給我們使用。

常用的數學函數方法 (1)

方法名稱

功能

round

求得double數值的四捨五入

abs

取得floatdouble的絕對值

ceil

取得大於該數的最小整數

floor

取得小於該數的最整數

max

傳回兩數之較大者

min

傳回兩數之較小者

sqrt

計算開平方

pow

計算某一數值nm次方

random

隨機產生在01之開區間中的數值

exp

計算自然指數(e為底數) 函數值

log

計算自然對數函數值

常用的數學函數方法(2)

三角函數sincostancotseccsc

反三角函數asinacosatanacotasecacsc

雙曲線函數sinhcosh

/*

測試算數類別的範例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

( 知識學習隨堂筆記 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=ben168&aid=163566285