Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第7、8章 輸入和輸出流、圖形界面設(shè)計(jì)_第1頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第7、8章 輸入和輸出流、圖形界面設(shè)計(jì)_第2頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第7、8章 輸入和輸出流、圖形界面設(shè)計(jì)_第3頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第7、8章 輸入和輸出流、圖形界面設(shè)計(jì)_第4頁(yè)
Java語(yǔ)言程序設(shè)計(jì)(自考)課件 第7、8章 輸入和輸出流、圖形界面設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩162頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章Java語(yǔ)言的高級(jí)特性學(xué)習(xí)目標(biāo)掌握數(shù)據(jù)流的基本概念和主要的操作方法,能夠?qū)崿F(xiàn)基本的輸入輸出功能掌握字節(jié)數(shù)據(jù)流的基本概念,包括文件數(shù)據(jù)流、過(guò)濾器數(shù)據(jù)流、緩沖數(shù)據(jù)流等,能夠使用字節(jié)數(shù)據(jù)流的主要操作方法實(shí)現(xiàn)基本的輸入輸出功能。能夠使用串接功能完成輸入輸出功能掌握字符流的基本概念,包括字符輸入流和字符輸出流。能夠使用緩沖區(qū)輸入輸出方法實(shí)現(xiàn)基本的輸入輸出功能掌握文件操作的基本方法,熟悉對(duì)文件操作的File類和RandomAccessFile隨機(jī)存取文件類。能夠創(chuàng)建File對(duì)象,使用文件對(duì)話框打開(kāi)和保存文件,能夠編寫文件輸入和輸出應(yīng)用程序本章內(nèi)容數(shù)據(jù)流的基本概念1基本字節(jié)數(shù)據(jù)流類2基本字符流3文件的處理4第一節(jié)數(shù)據(jù)流的基本概念數(shù)據(jù)流是指一組有順序的、有起點(diǎn)和終點(diǎn)的字節(jié)集合,程序從鍵盤接收數(shù)據(jù)或向文件中寫數(shù)據(jù),都可以使用數(shù)據(jù)流來(lái)完成

流被組織成不同的層次用于字節(jié)傳輸(如二進(jìn)制)用于字符傳輸

(如文本或ASCII)數(shù)據(jù)流分為輸入數(shù)據(jù)流和輸出數(shù)據(jù)流輸入數(shù)據(jù)流只能讀不能寫輸出數(shù)據(jù)流只能寫不能讀從數(shù)據(jù)流中讀取數(shù)據(jù)時(shí),必須有一個(gè)數(shù)據(jù)源與該數(shù)據(jù)流相連java.io包中提供了表示數(shù)據(jù)流的4個(gè)基本抽象類InputStream和OutputStreamReader和Writer要使用引入語(yǔ)句:importjava.io.*;輸入數(shù)據(jù)流輸入數(shù)據(jù)流(InputStream)是指只能讀不能寫的數(shù)據(jù)流,用于向計(jì)算機(jī)內(nèi)輸入信息而用java.io包中所有輸入數(shù)據(jù)流都是由抽象類InputStream繼承而來(lái)讀取數(shù)據(jù)、標(biāo)記位置、重置讀寫指針、獲取數(shù)據(jù)量從數(shù)據(jù)流中讀取數(shù)據(jù)時(shí),必須有一個(gè)數(shù)據(jù)源與該數(shù)據(jù)流相連輸入數(shù)據(jù)流中的主要數(shù)據(jù)操作方法以下3個(gè)方法提供了訪問(wèn)數(shù)據(jù)流中數(shù)據(jù)的方法,所讀取的數(shù)據(jù)都默認(rèn)為字節(jié)類型intread()從輸入流中讀取一個(gè)字節(jié)的二進(jìn)制數(shù)據(jù)intread(byte[]b)將多個(gè)字節(jié)讀到數(shù)組中,填滿整個(gè)數(shù)組intread(byte[]b,intoff,intlen)從輸入流中讀取長(zhǎng)度為len的數(shù)據(jù),從數(shù)組b中下標(biāo)為off的位置開(kāi)始放置讀入的數(shù)據(jù),讀畢返回讀取的字節(jié)數(shù)read()方法將讀取的一個(gè)字節(jié)作為低位,形成一個(gè)0~255之間的int類型的數(shù)值返回。它是一個(gè)抽象方法,需要在子類中具體實(shí)現(xiàn)輸入數(shù)據(jù)流中的主要數(shù)據(jù)操作方法voidclose()關(guān)閉數(shù)據(jù)流,同時(shí)釋放與該數(shù)據(jù)流相關(guān)的資源也可以由運(yùn)行時(shí)系統(tǒng)自動(dòng)關(guān)閉intavailable()返回目前可以從數(shù)據(jù)流中讀取的字節(jié)數(shù)(實(shí)際的讀操作所讀得的字節(jié)數(shù)可能大于該返回值)longskip(longl)跳過(guò)數(shù)據(jù)流中指定數(shù)量的字節(jié)不讀,返回值表示實(shí)際跳過(guò)的字節(jié)數(shù)輸入數(shù)據(jù)流中的主要數(shù)據(jù)操作方法booleanmarkSupported()用于測(cè)試數(shù)據(jù)流是否支持回推操作,當(dāng)一個(gè)數(shù)據(jù)流支持mark()和reset()方法時(shí)返回true,否則返回false。voidmark(intmarkarea)用于標(biāo)記數(shù)據(jù)流的當(dāng)前位置,并劃出一個(gè)緩沖區(qū),其大小至少為指定參數(shù)的大小。voidreset()將輸入流重新定位到對(duì)此流最后調(diào)用mark方法時(shí)的位置輸出數(shù)據(jù)流輸出數(shù)據(jù)流是指只能寫不能讀的流,用于從計(jì)算機(jī)中輸出數(shù)據(jù)java.io包中所有輸出數(shù)據(jù)流大多是從抽象類OutputStream繼承而來(lái),并且實(shí)現(xiàn)了其中的所有方法,這些方法主要提供了關(guān)于數(shù)據(jù)輸出方面的支持輸出數(shù)據(jù)流中的主要數(shù)據(jù)操作方法voidwrite(inti)將字節(jié)i寫入到數(shù)據(jù)流中,它只輸出所讀入?yún)?shù)的最低8位。該方法是抽象方法,需要在其輸出流子類中加以實(shí)現(xiàn),然后才能使用。voidwrite(byteb[])將數(shù)組b[]中的全部b.length個(gè)字節(jié)寫入數(shù)據(jù)流。voidwrite(byteb[],intoff,intlen)將數(shù)組b[]中從下標(biāo)off開(kāi)始的len個(gè)字節(jié)寫入數(shù)據(jù)流。元素b[off]是此操作寫入的第一個(gè)字節(jié),b[off+len-1]是此操作寫入的最后一個(gè)字節(jié)輸出數(shù)據(jù)流中的主要數(shù)據(jù)操作方法voidclose()當(dāng)結(jié)束對(duì)輸出數(shù)據(jù)流的操作時(shí)應(yīng)該將其關(guān)閉。voidflush()刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)緩存技術(shù)為加快數(shù)據(jù)傳輸速度,提高數(shù)據(jù)輸出效率,有時(shí)輸出數(shù)據(jù)流會(huì)在提交數(shù)據(jù)之前把所要輸出的數(shù)據(jù)先暫時(shí)保存在內(nèi)存緩沖區(qū)中,然后成批進(jìn)行輸出,每次傳輸過(guò)程都以某特定數(shù)據(jù)長(zhǎng)度為單位進(jìn)行傳輸這種方式下,在數(shù)據(jù)的末尾一般都會(huì)有一部分?jǐn)?shù)據(jù)由于數(shù)量不夠一個(gè)批次,而存留在緩沖區(qū)里,調(diào)用方法flush()可以將這部分?jǐn)?shù)據(jù)強(qiáng)制提交…緩沖區(qū)單位的容量末尾剩余部分第二節(jié)基本字節(jié)數(shù)據(jù)流類文件數(shù)據(jù)流包括FileImputStream和FileOutputStream,用來(lái)進(jìn)行文件的I/O處理,其數(shù)據(jù)源都應(yīng)當(dāng)是文件

對(duì)本機(jī)上的文件進(jìn)行操作,但是它們不支持方法mark()和reset()

在構(gòu)造文件數(shù)據(jù)流時(shí),可以直接給出文件名

FileInputStreamfis=newFileInputStream("myFile");

輸入輸出時(shí)處理異常示例使用文件數(shù)據(jù)流進(jìn)行I/O操作時(shí),對(duì)于類FileInputStream的實(shí)例對(duì)象,如果所指定的文件不存在,則產(chǎn)生FileNotFoundException異常,必須加以捕獲或聲明對(duì)于類FileOutputStream的實(shí)例對(duì)象,如果所指定的文件不存在,則系統(tǒng)創(chuàng)建一個(gè)新文件;如果存在,那么新寫入的內(nèi)容將會(huì)覆蓋原有數(shù)據(jù)如果在讀、寫文件或生成新文件時(shí)發(fā)生錯(cuò)誤,則會(huì)產(chǎn)生IOException異常,也需要由程序員捕獲并處理程序7.1示例可以使用FileInputStream來(lái)讀取FileOutputStream輸出的數(shù)據(jù)程序7.2過(guò)濾器數(shù)據(jù)流過(guò)濾器數(shù)據(jù)流在創(chuàng)建時(shí)與一個(gè)已經(jīng)存在的數(shù)據(jù)流相連,這樣在從這樣的數(shù)據(jù)流中讀取數(shù)據(jù)時(shí),它提供的是對(duì)一個(gè)原始輸入數(shù)據(jù)流的內(nèi)容進(jìn)行了特定處理的數(shù)據(jù)緩沖區(qū)數(shù)據(jù)流數(shù)據(jù)輸入流和數(shù)據(jù)輸出流

緩沖區(qū)數(shù)據(jù)流BufferedInputStream和BufferedOutputStream

都屬于過(guò)濾器數(shù)據(jù)流,都是在數(shù)據(jù)流上增加了一個(gè)緩沖區(qū)

讀寫數(shù)據(jù)時(shí),數(shù)據(jù)以塊為單位先進(jìn)入緩沖區(qū)(塊的大小可以進(jìn)行設(shè)置),其后的讀寫操作則作用于緩沖區(qū)

降低了不同硬件設(shè)備之間速度的差異,提高了I/O操作的效率

提供了對(duì)mark()、reset()、skip()等方法的支持

創(chuàng)建該類實(shí)例對(duì)象的方法一使用默認(rèn)緩沖區(qū)的大小

FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos);

創(chuàng)建該類實(shí)例對(duì)象的方法二自行設(shè)置緩沖區(qū)的大小FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis,1024);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos,1024);關(guān)閉一個(gè)緩沖區(qū)輸出流之前,應(yīng)使用flush()方法,強(qiáng)制輸出剩余數(shù)據(jù),以確保緩沖區(qū)內(nèi)的所有數(shù)據(jù)全部寫入輸出流

數(shù)據(jù)輸入流和數(shù)據(jù)輸出流DataInputStream和DataOutputStream允許通過(guò)數(shù)據(jù)流來(lái)讀寫Java基本數(shù)據(jù)類型布爾型(Boolean)浮點(diǎn)型(float)等等

數(shù)據(jù)流的創(chuàng)建方式DataInputStreamdis=newDataInputStream(is);DataOutputStreamdos=newDataOutputStream(os);DataInputStream類中的一些方法bytereadByte()longreadLong()doublereadDouble()booleanreadBoolean()StringreadUTF()intreadInt()floatreadFloat()shortreadShort()charreadChar()DataOutputStream類中的一些方法voidwriteByte(intaByte)voidwriteLong(longaLong)voidwriteDouble(doubleaDouble)voidwriteBoolean(booleanaBool)voidwriteUTF(StringaString)voidwriteInt(intanInt)voidwriteFloat(floataFloat)voidwriteShort(shortaShort)voidwriteChar(charaChar)對(duì)象流Java中的數(shù)據(jù)流不僅能對(duì)基本數(shù)據(jù)類型的數(shù)據(jù)進(jìn)行操作,而且也提供了把對(duì)象寫入文件數(shù)據(jù)流或從文件數(shù)據(jù)流中讀出的功能通過(guò)java.io包中ObjectInputStream和ObjectOutputStream兩個(gè)類實(shí)現(xiàn)能夠輸入輸出對(duì)象的流稱為對(duì)象流寫對(duì)象數(shù)據(jù)流將一個(gè)java.util.Date對(duì)象實(shí)例寫入文件

讀對(duì)象數(shù)據(jù)流readObject()把數(shù)據(jù)流以O(shè)bject類型返回,應(yīng)該在轉(zhuǎn)換為正確的類名之后再執(zhí)行序列化的概念能夠記錄自己的狀態(tài)以便將來(lái)得到復(fù)原的能力,叫對(duì)象的持久性(Persistence)稱一個(gè)對(duì)象是可持久的,意味著可以把這個(gè)對(duì)象存入磁盤、磁帶,或傳入另一臺(tái)機(jī)器保存在它的內(nèi)存或磁盤中。也就是說(shuō)把對(duì)象存為某種永久存儲(chǔ)類型

序列化的概念對(duì)象通過(guò)數(shù)值來(lái)描述自己的狀態(tài),記錄對(duì)象也就是記錄下這些數(shù)值把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化序列化的主要任務(wù)是寫出對(duì)象實(shí)例變量的數(shù)值序列化序列化是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問(wèn)題如果變量是另一個(gè)對(duì)象的引用,則引用的對(duì)象也要序列化。這個(gè)過(guò)程是遞歸的,保存的結(jié)果可以看作是一個(gè)對(duì)象網(wǎng)JDK1.1新增加了接口java.io.Serializable,并對(duì)Java虛擬機(jī)作了改動(dòng)以支持將Java對(duì)象存為數(shù)據(jù)流的功能只有實(shí)現(xiàn)Serializable接口的類才能被序列化當(dāng)一個(gè)類聲明實(shí)現(xiàn)Serializable接口時(shí),表明該類加入了對(duì)象序列化協(xié)議序列化示例示例程序7.3程序7.4對(duì)象結(jié)構(gòu)表序列化只能保存對(duì)象的非靜態(tài)成員變量,而不能保存任何成員方法和靜態(tài)成員變量,并且保存的只是變量的值,對(duì)于變量的任何修飾符都不能保存,訪問(wèn)權(quán)限(public,protected,private)對(duì)于數(shù)據(jù)域的序列化沒(méi)有影響有一些對(duì)象類不具有可持久性,因?yàn)槠鋽?shù)據(jù)的特性決定了它會(huì)經(jīng)常變化,其狀態(tài)只是瞬時(shí)的,這樣的對(duì)象是無(wú)法保存其狀態(tài)的,如Thread對(duì)象或流對(duì)象。對(duì)于這樣的成員變量,必須用transient關(guān)鍵字標(biāo)明,否則編譯器將報(bào)錯(cuò)。任何用transient關(guān)鍵字標(biāo)明的成員變量,都不會(huì)被保存對(duì)象結(jié)構(gòu)表當(dāng)數(shù)據(jù)變量是一個(gè)對(duì)象時(shí),該對(duì)象的數(shù)據(jù)成員也可以被持久化。對(duì)象的數(shù)據(jù)結(jié)構(gòu)或結(jié)構(gòu)樹(shù),包括其子對(duì)象樹(shù)在內(nèi),構(gòu)成了這個(gè)對(duì)象的結(jié)構(gòu)表如果一個(gè)對(duì)象結(jié)構(gòu)表中包含了一個(gè)對(duì)不可持久化對(duì)象的引用,而這個(gè)引用已用關(guān)鍵字transient加以標(biāo)記,則這個(gè)對(duì)象仍可以被持久化示例整個(gè)對(duì)象的序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privateStringcustomerID;privateinttotal;}數(shù)據(jù)不被序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privatetransientStringcustomerID;privateinttotal;}第三節(jié)基本字符流從JDK1.1開(kāi)始,java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎(chǔ)派生的一系列類Reader和Writer也是抽象類,只提供了一系列用于字符流處理的接口它們的方法與類InputStream和OutputStream類似,只不過(guò)其中的參數(shù)換成字符或字符數(shù)組字符輸入流和字符輸出流字符輸入流(Readers)和字符輸出流(Writers)提供對(duì)不同平臺(tái)之間數(shù)據(jù)流數(shù)據(jù)進(jìn)行轉(zhuǎn)換的功能同其他程序設(shè)計(jì)語(yǔ)言使用ASCII字符集不同,Java使用Unicode來(lái)表示字符串和字符ASCII字符集是以一個(gè)字節(jié)(8bit)來(lái)表示一個(gè)字符,所以可以認(rèn)為一個(gè)字符就是一個(gè)字節(jié)(byte)Unicode是一種大字符集,要用兩個(gè)字節(jié)(16bit)來(lái)表示一個(gè)字符

為實(shí)現(xiàn)與其他程序語(yǔ)言及不同平臺(tái)的交互,Java提供一種新的數(shù)據(jù)流處理方案,稱作字符輸入流(Reader)和字符輸出流(Writer)像數(shù)據(jù)流一樣,在java.io包中有許多不同類對(duì)其進(jìn)行支持,其中最重要的是InputStreamReader和OutputStreamWriter這兩個(gè)類是字節(jié)流和字符輸入流、字符輸出流的接口,用來(lái)在字節(jié)流和字符流之間作為中介使用這兩個(gè)類進(jìn)行字符處理時(shí),在構(gòu)造方法中應(yīng)指定一定的平臺(tái)規(guī)范,以便把以字節(jié)方式表示的流轉(zhuǎn)換為特定平臺(tái)上的字符表示構(gòu)造方法InputStreamReader(InputStreamin)默認(rèn)規(guī)范InputStreamReader(InputStreamin,Stringenc)指定規(guī)范encOutputStreamWriter(OutputStreamout)默認(rèn)規(guī)范OutputStreamWriter(OutputStreamout,Stringenc)指定規(guī)范enc字符輸入流提供的方法voidclose()voidmark(intreadAheadLimit)booleanmarkSupported()intread()intread(char[]cbuf)intread(char[]cbuf,intoff,intlen)booleanready()voidreset()longskip(longn)字符輸出流提供的方法voidclose()voidflush()voidwrite(char[]cbuf)voidwrite(char[]cbuf,intoff,intlen)voidwrite(intc)voidwrite(Stringstr)voidwrite(Stringstr,intoff,intlen)緩沖區(qū)字符輸入流和緩沖區(qū)字符輸出流如果格式轉(zhuǎn)換以較大數(shù)據(jù)塊為單位進(jìn)行,那么會(huì)提高效率java.io中提供了緩沖流BufferedReader和BufferedWriter其構(gòu)造方法與BufferedInputStream和BufferedOutputStream相類似除了read()和write()方法外,它還提供了整行字符處理方法publicStringreadLine()BufferedReader的方法,從輸入流中讀取一行字符,行結(jié)束標(biāo)志為‘\n’、‘\r’或兩者一起publicvoidnewLine()BufferedWriter的方法,向輸出流中寫入一個(gè)行結(jié)束標(biāo)志把BufferedReader或BufferedWriter正確連接到InputStreamReader或OutputStreamWriter的末尾是一個(gè)很好的方法要在BufferedWriter中使用flush()方法,以強(qiáng)制清空緩沖區(qū)中的剩余內(nèi)容,防止遺漏程序7.5程序7.6示例輔助類程序7.7程序7.8第四節(jié)文件的處理Java提供了File類,用于處理與文件相關(guān)的操作File對(duì)象可以用來(lái)生成與文件(及其所在的路徑)或目錄結(jié)構(gòu)相關(guān)的對(duì)象使用File類可以達(dá)到與系統(tǒng)無(wú)關(guān)的目的,使用的是抽象的路徑表示法類java.io.File提供了獲得文件基本信息及操作文件的一些方法File類創(chuàng)建一個(gè)新的File對(duì)象可以使用以下3種構(gòu)造方法第1種方法FilemyFile;myFile=newFile("mymotd");第2種方法myFile=newFile("/","mymotd");第3種方法FilemyDir=newFile("/");myFile=newFile(myDir,"mymotd");與文件名相關(guān)的方法StringgetName()獲取文件名StringgetPath()獲取文件路徑StringgetAbsolutePath()獲取文件絕對(duì)路徑StringgetParent()獲取文件父目錄名稱booleanrenameTo(FilenewName)更改文件名,成功則返回true,否則返回false文件測(cè)定方法booleanexists()文件對(duì)象是否存在booleancanWrite()文件對(duì)象是否可寫booleancanRead()文件對(duì)象是否可讀booleanisFile()文件對(duì)象是否是文件booleanisDirectory()文件對(duì)象是否是目錄booleanisAbsolute()文件對(duì)象是否是絕對(duì)路徑常用文件信息和方法longlastModified()獲取文件最后修改時(shí)間longlength()獲取文件長(zhǎng)度booleandelete()刪除文件對(duì)象指向的文件,成功則返回true,否則返回falseFile類方法使用示例程序7.9目錄工具booleanmkdir()創(chuàng)建新目錄booleanmkdirs()創(chuàng)建新目錄String[]list()列出符合模式的文件名隨機(jī)訪問(wèn)文件程序在讀寫文件時(shí),可能會(huì)隨機(jī)在文件的不同位置進(jìn)行讀取Java語(yǔ)言提供了類RandomAccessFile來(lái)處理這種類型的輸入輸出創(chuàng)建一個(gè)隨機(jī)訪問(wèn)文件的方法使用文件名myRAFile=newRandomAccessFile(Stringname,Stringmode);使用文件對(duì)象myRAFile=newRandomAccessFile(Filefile,Stringmode);參數(shù)mode決定是以只讀方式(“r”)還是以讀寫方式(“rw”)訪問(wèn)文件移動(dòng)文件讀寫指針的方法longgetFilePointer()返回文件指針的當(dāng)前位置voidseek(longpos)將文件指針置于指定的絕對(duì)位置。位置值以從文件開(kāi)始處的字節(jié)偏移量pos來(lái)計(jì)算,pos為0代表文件的開(kāi)始longlength()返回文件的長(zhǎng)度。位置值為length(),代表文件的結(jié)尾為文件添加信息時(shí)可以利用隨機(jī)訪問(wèn)文件來(lái)完成文件輸出的添加模式myRAFile=newRandomAccessFile("java.log","rw");myRAFile.seek(myRAFile.length());ThankYou!第八章圖形界面設(shè)計(jì)

學(xué)習(xí)目標(biāo)掌握AWT及Swing的特點(diǎn),了解AWT和Swing中類的層次結(jié)構(gòu),能夠正確創(chuàng)建簡(jiǎn)單的框架窗口、創(chuàng)建和使用面板,能夠通過(guò)內(nèi)容窗格添加組件能夠熟練使用標(biāo)簽和按鈕組件,并處理按鈕事件掌握FlowLayout、BorderLayout、GridLayout、CardLayout及BoxLayout等布局管理器的概念及使用方法,能夠進(jìn)行界面布局設(shè)計(jì),包括嵌套的布局設(shè)計(jì)掌握事件處理機(jī)制,理解委托事件處理模型,掌握響應(yīng)鼠標(biāo)和鍵盤事件掌握繪圖基礎(chǔ),能夠顯示不同字體不同顏色的文字,能夠繪制各種基本幾何形狀的圖形,并能給圖形著色本章內(nèi)容AWT與Swing1容器2標(biāo)簽及按鈕3布局管理器4事件處理5繪圖基礎(chǔ)6第一節(jié)AWT與Swing

AWT

Java抽象窗口工具集(AbstractWindowToolkit,簡(jiǎn)稱AWT)SwingSwing屬于JavaTMFoundationClasses(簡(jiǎn)稱JFC)的一部分,JFC包含了一組幫助程序員創(chuàng)建圖形用戶界面的功能。AWT功能有限,因此在后來(lái)的JDK版本中,又提供了功能更強(qiáng)的Swing

AWT與SwingJava的圖形用戶界面由各種組件構(gòu)成,在java.awt包和javax.swing包中定義了多種用于創(chuàng)建圖形用戶界面的組件類設(shè)計(jì)圖形用戶界面時(shí)一般完成3個(gè)步驟選取組件設(shè)計(jì)布局響應(yīng)事件Swing與AWT不同

Swing組件在實(shí)現(xiàn)時(shí)不包含任何本地代碼

Swing組件可以不受硬件平臺(tái)的限制,而具有更多的功能

Swing被稱為“輕量級(jí)(lightweight)”組件AWT稱為“重量級(jí)(heavyweight)”組件

“重量級(jí)”組件與“輕量級(jí)”組件一同使用時(shí),如果組件區(qū)域有重疊,則“重量級(jí)”組件總是顯示在上面

組件Java的圖形用戶界面由組件構(gòu)成按鈕(button)、文本輸入框(textfield)、標(biāo)簽(label)等都是組件有一類特殊的組件稱為容器(container)框架(frame)、面板(panel)等容器是組件的容器,各種組件(包括容器)可以通過(guò)add()方法添加到容器中

第二節(jié)容器組件可以分為容器組件和非容器組件所謂容器組件是指可以包含其他組件的組件又分為頂層容器和一般用途容器非容器組件則必須要包含在容器中顯示在屏幕上的所有組件都必須包含在某個(gè)容器中,有些容器可以嵌套,在這個(gè)嵌套層次的最外層,必須是一個(gè)頂層容器頂層容器

四種頂層容器JFrame、JApplet、JDialog和JwindowJFrame是一個(gè)帶有標(biāo)題行和控制按鈕(最小化、恢復(fù)/最大化、關(guān)閉)的獨(dú)立窗口,創(chuàng)建應(yīng)用程序時(shí)需要使用Jframe創(chuàng)建小應(yīng)用程序時(shí)使用JApplet,它被包含在瀏覽器窗口中創(chuàng)建對(duì)話框時(shí)使用JdialogJWindow是一個(gè)不帶有標(biāo)題行和控制按鈕的窗口,因此通常很少使用

JFrame類常用的構(gòu)造方法JFrame()構(gòu)造一個(gè)初始時(shí)不可見(jiàn)、無(wú)標(biāo)題的新框架窗體JFrame(Stringtitle)創(chuàng)建一個(gè)初始時(shí)不可見(jiàn)、具有指定標(biāo)題的新框架窗體JFrame類中的常用方法voidsetBounds(intx,inty,intwidth,intheight)移動(dòng)并調(diào)整框架大小。左上角位置的橫縱坐標(biāo)分別由x和y指定,框架的寬高分別由width和height指定voidsetSize(intwidth,intheight)設(shè)置框架的大小,寬度是width,高度是heightvoidsetBackground(Colorbg)使用顏色bg設(shè)置框架的背景色voidsetVisible(booleanaFlag)設(shè)置框架可見(jiàn)或不可見(jiàn)voidpack()調(diào)整框架的大小,以適合其子組件的首選大小和布局voidsetTitle(Stringtitle)設(shè)置框架的標(biāo)題為字符串titleContainergetContentPane()返回此框架窗體的內(nèi)容窗格對(duì)象voidsetLayout(LayoutManagermanager):設(shè)置布局管理器JFrame創(chuàng)建應(yīng)用程序

程序8-1內(nèi)容窗格頂層容器都有一個(gè)內(nèi)容窗格(Content

Pane)頂層容器中除菜單之外的組件都是放在這個(gè)內(nèi)容窗格中

將組件放入內(nèi)容窗格方法一通過(guò)頂層容器的getContentPane()方法獲得其缺省的內(nèi)容窗格。getContentPane()方法的返回類型為java.awt.Container,它仍然是一個(gè)容器。然后將組件添加到內(nèi)容窗格中

ContainercontentPane=frame.getContentPane();

contentPane.add(button,BorderLayout.CENTER);或合并為一條:

frame.getContentPane().add(button,BorderLayout.CENTER);

將組件放入內(nèi)容窗格方法二創(chuàng)建一個(gè)新的內(nèi)容窗格取代頂層容器缺省的內(nèi)容窗格創(chuàng)建一個(gè)JPanel的實(shí)例,它是java.awt.Container的子類。然后將組件添加到JPanel實(shí)例中,再通過(guò)頂層容器的setContentPane()方法將JPanel實(shí)例設(shè)置為新的內(nèi)容窗格頂層容器默認(rèn)內(nèi)容窗格的布局管理器是BorderLayoutJPanel默認(rèn)的布局管理器是FlowLayout需要為JPanel實(shí)例設(shè)置一個(gè)BorderLayout布局管理器程序8-2面板(JPanel)面板(JPanel)是一種用途廣泛的容器與頂層容器不同的是,面板不能獨(dú)立存在,必須被添加到其他容器內(nèi)部面板可以嵌套,由此可以設(shè)計(jì)出復(fù)雜的圖形用戶界面

JPanel類常用的構(gòu)造方法JPanel()創(chuàng)建具有FlowLayout布局的新面板JPanel(LayoutManagerlayout)創(chuàng)建具有指定布局管理器的新面板程序8.3JScrollPaneJScrollPane是帶有滾動(dòng)條的面板,它是Container類的子類只能添加一個(gè)組件當(dāng)有多個(gè)組件需要添加時(shí),一般地是先將多個(gè)組件添加到JPanel中,然后再將這個(gè)JPanel添加到JScrollPane中JScrollPane類常用的構(gòu)造方法JScrollPane()創(chuàng)建一個(gè)空的JScrollPane,需要時(shí)水平和垂直滾動(dòng)條都可顯示JScrollPane(Componentview)創(chuàng)建一個(gè)顯示指定組件內(nèi)容的JScrollPane,只要組件的內(nèi)容超過(guò)視圖大小就會(huì)顯示水平和垂直滾動(dòng)條JScrollPane類中常用的方法voidsetHorizontalScrollBarPolicy(intpolicy)確定水平滾動(dòng)條何時(shí)顯示在滾動(dòng)窗格上參數(shù)policy的可選值為下列三者之一ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED:需要時(shí)可見(jiàn)ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER:總是不可見(jiàn)ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS:總是可見(jiàn)JScrollPane類中常用的方法voidsetVerticalScrollBarPolicy(intpolicy)確定垂直滾動(dòng)條何時(shí)顯示在滾動(dòng)窗格上參數(shù)policy的可選值為下列三者之一ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED:需要時(shí)可見(jiàn)ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER:總是不可見(jiàn)ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS:總是可見(jiàn)滾動(dòng)條組件Scrollbar()構(gòu)造一個(gè)新的垂直滾動(dòng)條Scrollbar(intorientation)構(gòu)造一個(gè)具有指定方向的新滾動(dòng)條orientation指示滾動(dòng)條的方向Scrollbar.HORIZONTAL//水平滾動(dòng)條Scrollbar.VERTICAL//垂直滾動(dòng)條滾動(dòng)條組件Scrollbar(intorientation,intvalue,intvisible,intminimum,intmaximum)構(gòu)造一個(gè)新的滾動(dòng)條,它具有指定的方向、初始值、可視量、最小值和最大值orientation的值如前所述value是滾動(dòng)條的初始值visible是滾動(dòng)條的可視量,通常由滑動(dòng)塊的大小表示minimum是滾動(dòng)條的最小值maximum是滾動(dòng)條的最大值第三節(jié)標(biāo)簽及按鈕標(biāo)簽是最簡(jiǎn)單的Swing組件,通常用于顯示提示性的文本信息或圖標(biāo),不可被編輯構(gòu)造方法JLabel()創(chuàng)建一個(gè)既不顯示文本信息也不顯示圖標(biāo)的空標(biāo)簽JLabel(Iconimage)創(chuàng)建一個(gè)顯示圖標(biāo)的標(biāo)簽JLabel(Stringtext)創(chuàng)建一個(gè)顯示文本信息的標(biāo)簽JLabel(Iconimage,inthorizontalAlignment)創(chuàng)建一個(gè)顯示圖標(biāo)的標(biāo)簽,水平對(duì)齊方式由int型參數(shù)horizontalAlignment指定JLabel(Stringtext,inthorizontalAlignment)創(chuàng)建一個(gè)顯示文本信息的標(biāo)簽,水平對(duì)齊方式由int型參數(shù)horizontalAlignment指定JLabel(Stringtext,Iconicon,inthorizontalAlignment)創(chuàng)建一個(gè)同時(shí)顯示文本信息和圖標(biāo)的標(biāo)簽,水平對(duì)齊方式由int型參數(shù)horizontalAlignment指定構(gòu)造方法中,表示水平對(duì)齊方式的int型參數(shù)horizontalAlignment的取值JLabel.LEFT//左對(duì)齊JLabel.RIGHT//右對(duì)齊JLabel.CENTER//居中對(duì)齊按鈕按鈕(JButton)是Java圖形用戶界面的基本組件之一,經(jīng)常用到的按鈕有4種形式JbuttonJToggleButtonJCheckBoxJRadioButton它們均是AbstractButton的子類或間接子類各種按鈕上都可以設(shè)置文本、設(shè)置圖標(biāo)、注冊(cè)事件偵聽(tīng)程序JButton的構(gòu)造方法JButton()創(chuàng)建一個(gè)既沒(méi)有顯示文本也沒(méi)有圖標(biāo)的按鈕JButton(Iconicon)創(chuàng)建一個(gè)沒(méi)有顯示文本但有圖標(biāo)的按鈕JButton(Stringtext)創(chuàng)建一個(gè)有顯示文本但沒(méi)有圖標(biāo)的按鈕JButton(Stringtext,Iconicon)創(chuàng)建一個(gè)既有顯示文本又有圖標(biāo)的按鈕JButton類的常用方法publicvoidsetMnemonic(intmnemonic)設(shè)置當(dāng)前按鈕的鍵盤助記符publicvoidsetText(Stringtext)設(shè)置按鈕的文本publicStringgetText()返回按鈕的文本publicvoidsetToolTipText(Stringtext)設(shè)置要顯示的提示文本publicvoidaddActionListener(ActionListenerl)為按鈕添加事件偵聽(tīng)程序程序8.4切換按鈕、復(fù)選按鈕及單選按鈕切換按鈕(JToggleButton)是具有兩種狀態(tài)的按鈕,即選中狀態(tài)和未選中狀態(tài)構(gòu)造方法JToggleButton()創(chuàng)建一個(gè)既沒(méi)有顯示文本也沒(méi)有圖標(biāo)的切換按鈕JToggleButton(Iconicon)創(chuàng)建一個(gè)沒(méi)有顯示文本但有圖標(biāo)的切換按鈕JToggleButton(Iconicon,booleanselected)創(chuàng)建一個(gè)沒(méi)有顯示文本但有圖標(biāo)和指定初始狀態(tài)的切換按鈕構(gòu)造方法JToggleButton(Stringtext)創(chuàng)建一個(gè)有顯示文本但沒(méi)有圖標(biāo)的切換按鈕JToggleButton(Stringtext,booleanselected)創(chuàng)建一個(gè)有顯示文本和指定初始狀態(tài)但沒(méi)有圖標(biāo)的切換按鈕JToggleButton(Stringtext,Iconicon)創(chuàng)建一個(gè)既有顯示文本又有圖標(biāo)的切換按鈕JToggleButton(Stringtext,Iconicon,booleanselected)創(chuàng)建一個(gè)既有顯示文本又有圖標(biāo)和指定初始狀態(tài)的切換按鈕JCheckBox和JRadioButton都是JToggleButton的子類,構(gòu)造方法的格式與JToggleButton相同,它們也都具有選中和未選中兩種狀態(tài)在JToggleButton類中定義了一個(gè)isSelected()方法,通過(guò)該方法可以獲知按鈕的當(dāng)前狀態(tài):當(dāng)返回值為true時(shí)表示處于選中狀態(tài),而返回值為false時(shí)則表示處于未選中狀態(tài)程序8.5第四節(jié)布局管理器組件的布局,包括位置和大小,通常由布局管理器(LayoutManager)負(fù)責(zé)安排每個(gè)容器都有一個(gè)缺省的布局管理器通過(guò)容器的setLayout()方法改變?nèi)萜鞯牟季止芾砥鱂lowLayout布局管理器

FlowLayout定義在java.awt包中,對(duì)容器中組件進(jìn)行布局的方式是將組件逐個(gè)地安放在容器中的一行上,一行放滿后就另起一個(gè)新行。在缺省情況下,將組件居中放置在容器的某一行上

FlowLayout布局管理器并不強(qiáng)行設(shè)定組件的大小,而是允許組件擁有它們自己所希望的尺寸

每個(gè)組件都有一個(gè)getPreferredSize()方法,布局管理器會(huì)調(diào)用這一方法取得每個(gè)組件希望的大小

FlowLayout構(gòu)造方法

FlowLayout()FlowLayout(intalign)FlowLayout(intalign,inthgap,intvgap)對(duì)齊方式的可選項(xiàng)align的取值FlowLayout.LEFTFlowLayout.RIGHTFlowLayout.CENTERhgap和vgap,可以設(shè)定組件的水平間距和垂直間距程序8.6

BorderLayout布局管理器BorderLayout是頂層容器中內(nèi)容窗格的缺省布局管理器由BorderLayout管理的容器被劃分成北(North)南(South)西(West)東(East)中(Center)五個(gè)區(qū)域,分別代表容器的上、下、左、右和中部,表示為常量BorderLayout.NORTHBorderLayout.SOUTHBorderLayout.WESTBorderLayout.EASTBorderLayout.CENTERBorderLayout定義在java.awt包中BorderLayout構(gòu)造方法BorderLayout()構(gòu)造一個(gè)組件之間沒(méi)有間距的新BorderLayout布局管理器BorderLayout(inthgap,intvgap)用指定的組件之間的水平和垂直間距構(gòu)造一個(gè)BorderLayout布局管理器組件必須通過(guò)add()方法加入到容器中的指定區(qū)域如果在add()方法中沒(méi)有指定將組件放到哪個(gè)區(qū)域,則默認(rèn)地會(huì)被放置在Center區(qū)域在容器的每個(gè)區(qū)域,只能加入一個(gè)組件,如果試圖向某個(gè)區(qū)域中加入多個(gè)組件,那么只有最后一個(gè)組件是有效的程序8.7GridLayout布局管理器GridLayout是一種網(wǎng)格式的布局管理器,它將容器空間劃分成若干行乘若干列的網(wǎng)格,組件依次放入其中,每個(gè)組件占據(jù)一格

網(wǎng)格每列的寬(高)度都是相同的,這個(gè)寬度大致等于容器的寬度除以網(wǎng)格的列(行)數(shù)組件被放入容器的次序決定了它所占據(jù)的位置。每行網(wǎng)格從左至右依次填充,一行用完之后轉(zhuǎn)入下一行當(dāng)容器的大小改變時(shí),GridLayout所管理的組件的相對(duì)位置不會(huì)發(fā)生變化,但組件的大小會(huì)隨之改變GridLayout構(gòu)造方法GridLayout():創(chuàng)建一個(gè)只有一行的網(wǎng)格,網(wǎng)格的列數(shù)根據(jù)實(shí)際需要而定GridLayout(introws,intcols)創(chuàng)建具有指定行數(shù)和列數(shù)的網(wǎng)格布局GridLayout(introws,intcols,inthgap,intvgap)創(chuàng)建具有指定行數(shù)和列數(shù),且有指定水平間距和垂直間距的網(wǎng)格布局程序8.8CardLayout布局管理器

CardLayout也是定義在java.awt包中的布局管理器,這是一種卡片式的布局管理器,它將容器中的組件處理為一系列卡片,每一時(shí)刻只顯示出其中的一張,而容器充當(dāng)卡片的容器卡片的順序由組件對(duì)象本身在容器內(nèi)部的順序決定CardLayout定義了一組方法,這些方法允許應(yīng)用程序按順序地瀏覽這些卡片,或者顯示指定的卡片CardLayout的構(gòu)造方法CardLayout()創(chuàng)建一個(gè)默認(rèn)的無(wú)間距的新的CardLayout布局管理器CardLayout(inthgap,intvgap)創(chuàng)建一個(gè)具有指定的水平和垂直間距的新的CardLayout布局管理器常用方法publicvoidfirst(Containerparent)翻轉(zhuǎn)到容器的第一張卡片publicvoidnext(Containerparent)翻轉(zhuǎn)到指定容器的下一張卡片。如果當(dāng)前的可見(jiàn)卡片是最后一個(gè),則此方法翻轉(zhuǎn)到布局的第一張卡片publicvoidprevious(Containerparent)翻轉(zhuǎn)到指定容器的前一張卡片。如果當(dāng)前的可見(jiàn)卡片是第一個(gè),則此方法翻轉(zhuǎn)到布局的最后一張卡片常用方法publicvoidlast(Containerparent)翻轉(zhuǎn)到容器的最后一張卡片publicvoidshow(Containerparent,Stringname)翻轉(zhuǎn)到已添加到此布局的具有指定name的卡片。如果不存在這樣的卡片,則不發(fā)生任何操作程序8.9BoxLayoutBoxLayout是定義在javax.swing包中的另一種常用布局管理器,它將容器中的組件按水平方向排成一行或按垂直方向排成一列當(dāng)組件排成一行時(shí),每個(gè)組件可以有不同的寬度當(dāng)組件排成一列時(shí),每個(gè)組件可以有不同的高度構(gòu)造方法BoxLayout(Containertarget,intaxis):創(chuàng)建一個(gè)將沿給定軸放置組件的布局管理器程序8.10在javax.swing包中定義了一個(gè)專門使用BoxLayout的特殊容器——Box類,Box類中提供了創(chuàng)建Box實(shí)例的靜態(tài)方法:publicstaticBoxcreateHorizontalBox():使用水平方向的BoxLayoutpublicstaticBoxcreateVerticalBox():使用垂直方向的BoxLayout程序8.11空布局在特殊場(chǎng)合,也可以不使用布局管理器,而是通過(guò)數(shù)值指定組件的位置和大小,這時(shí)首先需要調(diào)用容器的setLayout(null)將布局管理器設(shè)置為空,然后調(diào)用組件的setBounds()方法設(shè)置組件的位置和大小setBounds(intx,inty,intwidth,intheight)前兩個(gè)int型參數(shù)設(shè)置組件的位置后兩個(gè)int型參數(shù)設(shè)置組件的寬度和高度程序8.12第五節(jié)事件處理

事件處理模型用戶在程序界面所進(jìn)行的操作稱為用戶事件(Event)

Java中定義了很多事件類,用于描述不同的用戶行為代表鼠標(biāo)事件的MouseEvent類代表鍵盤事件的KeyEvent類在組件上進(jìn)行某種操作,事件處理系統(tǒng)便會(huì)生成一個(gè)事件類對(duì)象系統(tǒng)將事件分類,稱為事件類型每類事件對(duì)應(yīng)一個(gè)偵聽(tīng)程序接口,它規(guī)定了接收并處理該類事件的方法的規(guī)范組件必須注冊(cè)相應(yīng)的事件處理程序,這種事件處理程序稱為事件的偵聽(tīng)程序(Listener)事件的種類java.awt.event包和javax.swing.event包中定義了很多事件類例如ItemEvent、MouseEvent和KeyEvent等,并且第三方內(nèi)容也可加入其中每種事件類都有一個(gè)對(duì)應(yīng)的接口,接口中聲明了一個(gè)或多個(gè)抽象的事件處理方法,凡是需要接收并處理事件類對(duì)象的類,都需要實(shí)現(xiàn)相應(yīng)的接口

按鈕上的事件為了處理按鈕上的ActionEvent事件,需要定義一個(gè)實(shí)現(xiàn)ActionListener接口的偵聽(tīng)程序類。對(duì)應(yīng)ActionEvent事件,有ActionListener接口:publicinterfaceActionListenerextendsEventListener{ publicvoidactionPerformed(ActionEvente);}該接口中只定義了一個(gè)方法,即actionPerformed()當(dāng)出現(xiàn)ActionEvent事件時(shí),就會(huì)調(diào)用該方法每個(gè)組件都有若干個(gè)形如addXXXListener(XXXListener)的方法,通過(guò)這類方法,可以為組件注冊(cè)事件偵聽(tīng)程序也可以刪除添加的事件偵聽(tīng)程序這種處理事件機(jī)制稱為委托事件處理模型或委派事件處理機(jī)制事件處理步驟程序中引入java.awt.event包:

importjava.awt.event;給所需的事件源對(duì)象注冊(cè)事件偵聽(tīng)程序

事件源對(duì)象.addXXXListener(XXXListener);實(shí)現(xiàn)相應(yīng)的方法若某個(gè)偵聽(tīng)程序接口包含多個(gè)方法,則需要實(shí)現(xiàn)所有的方法ButtonHandler類程序8.13示例MyButton類程序8.14自定義的MyButton組件繼承自JButton,同時(shí)實(shí)現(xiàn)了ActionListener接口MyButton組件對(duì)象可注冊(cè)事件偵聽(tīng)程序在MyButton的構(gòu)造方法中,通過(guò)addActionListener(this)將自身注冊(cè)為自己的偵聽(tīng)程序。當(dāng)用戶單擊按鈕時(shí),調(diào)用System.exit(0),結(jié)束程序的運(yùn)行事件的種類在java.awt.event包和javax.swing.event包中還定義了很多其他事件類ActionEventItemEventMouseEventKeyEvent每種事件類都有一個(gè)對(duì)應(yīng)的接口,接口中聲明了一個(gè)或多個(gè)抽象的事件處理方法。凡是需要接收并處理事件類對(duì)象的類,都需要實(shí)現(xiàn)相應(yīng)的接口常用事件類型及接口

常用事件類型及接口常用事件類型及接口示例程序8.15拖動(dòng)鼠標(biāo)引發(fā)MouseMotionEvent事件可以由實(shí)現(xiàn)了MouseMotionListener接口的類來(lái)處理MouseMotionListener接口中聲明了兩個(gè)抽象方法,分別用于處理鼠標(biāo)的拖動(dòng)和移動(dòng)。在實(shí)現(xiàn)MouseMotionListener接口的類里,必須同時(shí)實(shí)現(xiàn)上述兩個(gè)方法可以在同一個(gè)組件上偵聽(tīng)多類事件f.addMouseListener(this);f.addMouseMotionListener(this);事件適配器

為了進(jìn)行事件處理,需要?jiǎng)?chuàng)建實(shí)現(xiàn)Listener接口的類,而某些Listener接口中,聲明了很多抽象方法,為了實(shí)現(xiàn)這些接口,需要一一實(shí)現(xiàn)這些方法

為了編程方便,Java為一些聲明了多個(gè)方法的Listener接口提供了相對(duì)應(yīng)的適配器(Adapter)類,在適配器類中實(shí)現(xiàn)了相應(yīng)接口中的全部方法,只是方法的內(nèi)容為空

接口及適配器

示例MouseListener接口的形式示例與其對(duì)應(yīng)的適配器為MouseAdapter程序8.16第六節(jié)繪圖基礎(chǔ)顯示屏上一個(gè)長(zhǎng)方形區(qū)域?yàn)槌绦虻睦L圖區(qū)域坐標(biāo)原點(diǎn)(0,0)位于整個(gè)區(qū)域的左上角一個(gè)坐標(biāo)點(diǎn)(x,y)對(duì)應(yīng)屏幕窗口中的一個(gè)像素x與y必須都是非負(fù)整數(shù)x在水平方向上從左向右遞增y在豎直方向上從上向下遞增可以設(shè)定繪圖區(qū)域的寬width和高h(yuǎn)eight顏色可以使用java.awt包中的Color類來(lái)定義和管理顏色Color類的每個(gè)對(duì)象表示一種顏色可以有兩種方法生成顏色使用Java的Color類中預(yù)定義的顏色通過(guò)紅、綠、藍(lán)三原色的值來(lái)組合使用Java的Color類中預(yù)定義的顏色Color類中包含了26個(gè)常量,提供了13種基本的預(yù)定義的顏色顏色對(duì)象RGB值黑色Color.black0,0,0藍(lán)色Color.blue0,0,255青色Color.cyan0,255,255灰色Color.gray128,128,128深灰色Color.darkGray64,64,64淺灰色Color.lightGray192,192,192綠色Color.green0,255,0洋紅色Color.magenta255,0,255橙色Color.orange255,200,0粉紅色Color.pink255,175,175紅色Color.red255,0,0白色Color.white255,255,255黃色Color.yellow255,255,0通過(guò)紅、綠、藍(lán)三原色的值來(lái)組合每種顏色由三個(gè)值來(lái)指定,它們一起稱為RGB值,RGB分別代表紅-綠-藍(lán)各個(gè)值表示對(duì)應(yīng)原色的相對(duì)值,使用1個(gè)字節(jié)(8位)來(lái)保存,取值范圍為0到255三種原色的值合在一起決定實(shí)際的顏色值intr=255,g=255,b=0;ColormyColor=newColor(r,g,b);可以使用下面兩個(gè)定義在Jcomponent中的方法設(shè)置組件的前景色和背景色publicvoidsetForeground(Colorc):設(shè)置前景色publicvoidsetBackground(Colorc):設(shè)置背景色字體文字的方法publicvoiddrawChars(char[]data,intoffset,intlength,intx,inty)使用此圖形上下文的當(dāng)前字體和顏色顯示字符數(shù)組data中從offset位置開(kāi)始、最多l(xiāng)ength個(gè)字符首字符的基線位于此圖形上下文坐標(biāo)系統(tǒng)的(x,y)處publicvoiddrawString(StringaString,intx,inty)在指定位置顯示字符串a(chǎn)StringpublicvoiddrawBytes(byte[]data,intoffset,intlength,intx,inty)使用此圖形上下文的當(dāng)前字體和顏色顯示由指定的byte數(shù)組data中從offset位置開(kāi)始、最多l(xiāng)ength個(gè)字符首字符的基線位于此圖形上下文坐標(biāo)系統(tǒng)的(x,y)處字體與樣式常用的字體TimesNewromanSymbol宋體楷體等基本的樣式,可以組合使用Font.PLAIN(正常)Font.BOLD(粗體)Font.ITALIC(斜體)創(chuàng)建字體對(duì)象通過(guò)給定字體名稱、樣式和大小自己創(chuàng)建Font對(duì)象,構(gòu)造方法是:Font(Stringname,intstyle,intsize)根據(jù)指定名稱、樣式和字號(hào),創(chuàng)建一個(gè)新FontFont類中常用的方法StringgetName()返回此Font的邏輯名稱,即字體名稱intgetSize()返回此Font的字號(hào)大小,舍入為整數(shù)intgetStyle()返回此Font的樣式booleanisBold()測(cè)試此Font對(duì)象的樣式是否為BOLDbooleanisItalic()測(cè)試此Font對(duì)象的樣式是否為ITALICbooleanisPlain()測(cè)試此Font對(duì)象的樣式是否為PLAIN列出當(dāng)前機(jī)器上可用的所有字體示例程序8.17Graphics類的基本功能java.awt包中的Graphics類是所有圖形處理的基礎(chǔ)Graphics類是所有圖形上下文的抽象父類這個(gè)類提供的功能有建立字體設(shè)定顯示顏色顯示圖像和文本繪制和填充各種幾何圖形可以在組件上繪制圖形當(dāng)先后繪圖的圖形有重疊時(shí),如何確定重疊部分的顏色呢?這稱為繪圖模式繪圖模式主要有兩種正常模式異或模式正常模式下,后繪制的圖形覆蓋先繪制的圖形,使得先繪制的圖形被重疊的部分不再可見(jiàn)異或模式下,當(dāng)前繪制的顏色、先前繪制的顏色及所選定的某種顏色之間進(jìn)行某種處理,使用得到的新顏色值進(jìn)行繪制設(shè)置繪圖模式的方法setPaintMode()將此圖形上下文的繪圖模式設(shè)置為正常模式,這是默認(rèn)模式setXORMode(Colorc)將此圖形上下文的繪圖模式設(shè)置為異或模式,參數(shù)c指定了繪制對(duì)象時(shí)與窗口進(jìn)行異或操作的顏色所有繪制都必須通過(guò)一個(gè)圖形對(duì)象完成可以直接在框架(Frame)中顯示文本信息可以直接在框架中繪圖在某個(gè)組件中繪圖,一般應(yīng)該為這個(gè)組件所屬的子類重寫paint()方法,在該重寫的方法中進(jìn)行繪圖要在JComponent子類的組件中繪圖,應(yīng)重寫paintComponent()方法,在該方法中進(jìn)行繪圖系統(tǒng)自動(dòng)為程序提供圖形對(duì)象,并以參數(shù)g傳遞給paint()方法和paintComponent()方法示例比如,JPanel非常適合于繪制自定義圖形,其圖形對(duì)象是作為paintComponent()方法的參數(shù)獲得的通常的做法是首先在一個(gè)面板中進(jìn)行繪制然后再將這個(gè)面板添加到框架中要?jiǎng)?chuàng)建自定義圖形,需要由JPanel類派生一個(gè)新類。并重寫父類的paintComponent()方法:publicvoidpaintComponent(Graphicsg){ ...//將在這里通過(guò)參數(shù)g編寫繪制代碼}paintComponent方法包含一個(gè)Graphics類型的參數(shù)??梢詮膱D形對(duì)象或使用Component的getGraphics()方法得到Graphics對(duì)象。Component類中定義了paint(Graphicsg)方法當(dāng)組件被顯示出來(lái)時(shí),將調(diào)用該方法Component中還定義了一個(gè)repaint()方法每當(dāng)需要重繪組件時(shí),可以調(diào)用該方法,該方法將自動(dòng)調(diào)用paint(Graphicsg)javax.swing.JComponent繼承java.awt.Component,并重寫了paint(Graphicsg)方法在javax.swing.JComponent的paint(Graphicsg)方法中,會(huì)調(diào)用如下3個(gè)方法:paintComponent(Graphicsg):繪制組件paintBorder(Graphicsg):繪制組件的邊框paintChildren(Graphicsg):繪制組件中的子組件如果需要在組件上繪制圖形,只需要重寫JComponent的paintComponent(Graphicsg)方法,該方法的參數(shù)是一個(gè)Graphics對(duì)象繪圖方法drawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)沿著由左上角為(x,y)、寬為width、高為height的外接矩形所限定的橢圓繪制一條弧。弧起始于startAngle,延伸的距離由arcAngle定義繪圖方法drawLine(intx1,inty1,intx2,inty2)繪制一條從點(diǎn)(x1,y1)到點(diǎn)(x2,y2)的直線drawOval(intx,inty,intwidth,intheight)繪制一個(gè)由左上角為(x,y)、寬為width、高為height的外接矩形所限定的橢圓繪圖方法drawPolygon(int[]xPoints,int[]yPoints,intnPoints)繪制由x和y坐標(biāo)數(shù)組定義的一系列連接線。每對(duì)(x,y)坐標(biāo)定義了一個(gè)點(diǎn)。如果第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)不同,則圖形不是閉合的drawRect(intx,inty,intwidth,intheight)繪制一個(gè)矩形,其左上角為(x,y),寬為width,高為height繪圖方法drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)用此圖形上下文的當(dāng)前顏色繪制圓角矩形的邊框。矩形的左邊和右邊分別位于x和x+width。矩形的頂邊和底邊位于y和y+height繪圖方法drawString(Stringstr,intx,inty)在點(diǎn)(x,y)處輸出字符串str,向右擴(kuò)展draw3DRect((intx,inty,intwidth,intheight,booleanraised))繪制指定矩形的3-D突出顯示邊框。矩形的左上角為(x,y),寬為width,高為height。raised指示矩形是凸出平面顯示還是凹入平面顯示填充方法fillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle)fillOval(intx,inty,intwidth,intheight)fillPolygon(int[]xPoints,int[]yPoints,intnPoints)fillRect(intx,inty,intwidth,intheight)fillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)畫多邊形畫多邊形的方法分別是drawPolygon()和fillPolygon()當(dāng)使用數(shù)組做參數(shù)時(shí),drawPolygon()和fillPolygon()方法各帶3個(gè)參數(shù)第一個(gè)參數(shù)是表示多邊形各點(diǎn)x坐標(biāo)的整數(shù)數(shù)組第二個(gè)參數(shù)是表示多邊形各點(diǎn)y坐標(biāo)的整數(shù)數(shù)組第三個(gè)參數(shù)是一個(gè)整數(shù),表示兩個(gè)數(shù)組中有多少個(gè)點(diǎn)可用放在一起來(lái)看,前兩個(gè)參數(shù)表示多邊形各點(diǎn)的(x,y)坐標(biāo)當(dāng)使用Polygon類做參數(shù)時(shí),可以使用Java標(biāo)準(zhǔn)類庫(kù)java.awt包中定義的Polygon類的對(duì)象來(lái)顯式地定義多邊形。drawPolygon()和fillPolygon()方法都重載了兩個(gè)方法,并且都僅帶一個(gè)Polygon對(duì)象參數(shù)Polygon類中的常用方法Polygon()構(gòu)造方法,創(chuàng)建空的多邊形Polygon(int[]xpoints,int[]ypoints,intnpoints)構(gòu)造方法,使用xpoints和ypopints中的項(xiàng)對(duì)應(yīng)的坐標(biāo)對(duì)(x,y)來(lái)創(chuàng)建多邊形addPoint(intx,inty)將由參數(shù)指定的點(diǎn)加入到多邊形中contains(intx,inty)如果指定的點(diǎn)含在多邊形中,則返回真contains(Pointp)如果指定的點(diǎn)含在多邊形中,則返回真getBounds()得到多邊形的外接矩形translate(intdeltaX,intdeltaY)將多邊形的各頂點(diǎn)沿x軸偏移deltaX,沿y軸偏移deltaY程序8.18Graphics2D繪圖Java2D包括一個(gè)繼承于Graphics類的Graphics2D類,增加了許多狀態(tài)屬性,擴(kuò)展了Graphics的繪圖功能,可以繪制出更加豐富多彩的圖形Graphics2D擁有更強(qiáng)大的二維圖形處理能力,提供對(duì)幾何形狀、坐標(biāo)轉(zhuǎn)換、顏色管理以及文字布局等更復(fù)雜的控制圖形狀態(tài)屬性Graphics2D類中定義了幾種方法,用于添加或改變圖形的狀態(tài)屬性通過(guò)設(shè)定和修改狀態(tài)屬性,可以指定畫筆寬度和畫筆的連接方式、設(shè)定平移、旋轉(zhuǎn)、縮放或剪裁變換圖形還可以設(shè)定填充圖形的顏色和圖案等stroke屬性stroke屬性控制線的寬度、筆形樣式、線段連接方式或短劃線圖案。創(chuàng)建BasicStroke對(duì)象后,再調(diào)用setStroke()方法即可設(shè)置stroke屬性。創(chuàng)建BasicStroke對(duì)象的方法BasicStroke(floatw):指定線的寬度wBasicStroke(floatw,intcap,intjoin):指定線的寬度w,端點(diǎn)樣式cap及兩線段交匯處的連接方式j(luò)oinpaint屬性paint屬性控制填充效果。先調(diào)用GradientPaint()方法確定填充效果,再使用setPaint()方法進(jìn)行設(shè)置GradientPaint()方法GradientPaint(floatx1,floaty1,Colorc1,floatx2,flaoty2,Colorc2):構(gòu)造一個(gè)簡(jiǎn)單的非周期性的GradientPaint對(duì)象GradientPaint(floatx1,floaty1,C

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論