Java編程中應(yīng)用的GUI設(shè)計(jì)基礎(chǔ)
早先程序使用最簡(jiǎn)單的輸入輸出方式,用戶(hù)在鍵盤(pán)輸入數(shù)據(jù),程序?qū)⑿畔⑤敵鲈谄聊簧稀,F(xiàn)代程序要求使用圖形用戶(hù)界面(Graphical User Interface,GUI),界面中有菜單、按鈕等,用戶(hù)通過(guò)鼠標(biāo)選擇菜單中的選項(xiàng)和點(diǎn)擊按鈕,命令程序功能模塊。本章學(xué)習(xí)如何用Java語(yǔ)言編寫(xiě)GUI科學(xué)試驗(yàn),如何通過(guò)GUI實(shí)現(xiàn)輸入和輸出。
AWT和Swing
先前用Java編寫(xiě)GUI程序,是使用抽象窗口工具包AWT(Abstract Window Toolkit).現(xiàn)在多用Swing。Swing可以看作是AWT的改良版,而不是代替AWT,是對(duì)AWT的提高和擴(kuò)展。所以,在寫(xiě)GUI程序時(shí),Swing和AWT都要作用。它們共存于Java基礎(chǔ)類(lèi)(Java Foundation Class,JFC)中。
盡管AWT和Swing都提供了構(gòu)造圖形界面元素的類(lèi),但它們的重要方面有所不同:AWT依賴(lài)于主平臺(tái)繪制用戶(hù)界面組件;而Swing有自己的機(jī)制,在主平臺(tái)提供的窗口中繪制和管理界面組件。Swing與AWT之間的最明顯的區(qū)別是界面組件的外觀,AWT在不同平臺(tái)上運(yùn)行相同的程序,界面的外觀和風(fēng)格可能會(huì)有一些差異。然而,一個(gè)基于Swing的應(yīng)用程序可能在任何平臺(tái)上都會(huì)有相同的外觀和風(fēng)格。
Swing中的類(lèi)是從AWT繼承的,有些Swing類(lèi)直接擴(kuò)展AWT中對(duì)應(yīng)的類(lèi)。例如,JApplet、JDialog、JFrame和JWindow。
使用Swing設(shè)計(jì)圖形界面,主要引入兩個(gè)包:
- javax.swing包:包含Swing的基本類(lèi);
- java.awt.event包:包含與處理事件相關(guān)的接口和類(lèi)。
由于Swing太豐富,不可能在一本教科書(shū)中給出Swing的全面介紹,但本章所介紹的有關(guān)Swing的知識(shí),已足以讓讀者編寫(xiě)相當(dāng)精美的GUI程序。
組件和容器
組件(component)是圖形界面的基本元素,用戶(hù)可以直接操作,例如按鈕。容器(Container)是圖形界面的的復(fù)合元素,容器可以包含組件,例如面板。
Java語(yǔ)言為每種組件都預(yù)定義類(lèi),程序通過(guò)它們或它們的子類(lèi)各種組件對(duì)象,如,Swing中預(yù)定義的按鈕類(lèi)JButton是一種類(lèi),程序創(chuàng)建的JButton對(duì)象,或JButton子類(lèi)的對(duì)象就是按鈕。Java語(yǔ)言也為每種容器預(yù)定義類(lèi),程序通過(guò)它們或它們的子類(lèi)創(chuàng)建各種容器對(duì)象。例如,Swing中預(yù)定義的窗口類(lèi)JFrame是一種容器類(lèi),程序創(chuàng)建的JFrame或JFrame子類(lèi)的對(duì)象就是窗口。
為了統(tǒng)一管理組件和容器,為所有組件類(lèi)定義超類(lèi),把組件的共有操作都定義在Component類(lèi)中。同樣,為所有容器類(lèi)定義超類(lèi)Container類(lèi),把容器的共有操作都定義在Container類(lèi)中。例如,Container類(lèi)中定義了add()方法,大多數(shù)容器都可以用add()方法向容器添加組件。
Component、Container和Graphics類(lèi)是AWT庫(kù)中的關(guān)鍵類(lèi)。為能層次地構(gòu)造復(fù)雜的圖形界面,容器被當(dāng)作特殊的組件,可以把容器放入另一個(gè)容器中。例如,把若干按鈕和文本框分放在兩個(gè)面板中,再把這兩個(gè)面板和另一些按鈕放入窗口中。這種層次地構(gòu)造界面的方法,能以增量的方式構(gòu)造復(fù)雜的用戶(hù)界面。
事件驅(qū)動(dòng)程序設(shè)計(jì)基礎(chǔ)
1.事件、監(jiān)視器和監(jiān)視器注冊(cè)
圖形界面上的事件是指在某個(gè)組件上發(fā)生用戶(hù)操作。例如,用戶(hù)單擊了界面上的某個(gè)按鈕,就說(shuō)在這個(gè)按鈕上發(fā)生了事件,這個(gè)按鈕對(duì)象就是事件的擊發(fā)者。對(duì)事件作監(jiān)視的對(duì)象稱(chēng)為監(jiān)視器,監(jiān)視器提供響應(yīng)事件的處理方法。為了讓監(jiān)視器與事件對(duì)象關(guān)聯(lián)起來(lái),需要對(duì)事件對(duì)象作監(jiān)視器注冊(cè),告訴系統(tǒng)事件對(duì)象的監(jiān)視器。
以程序響應(yīng)按鈕事件為例,程序要?jiǎng)?chuàng)建按鈕對(duì)象,把它添加到界面中,要為按鈕作監(jiān)視器注冊(cè),程序要有響應(yīng)按鈕事件的方法。當(dāng)“單擊按鈕”事件發(fā)生時(shí),系統(tǒng)就調(diào)用已為這個(gè)按鈕注冊(cè)的事件處理方法,完成處理按鈕事件的工作。
2.實(shí)現(xiàn)事件處理的途征
java語(yǔ)言編寫(xiě)事件處理程序主要有兩種方案:一個(gè)是程序重設(shè)handleEvent(Eventevt),采用這個(gè)方案的程序工作量稍大一些;另一個(gè)方案是程序?qū)崿F(xiàn)一些系統(tǒng)設(shè)定的接口。java按事件類(lèi)型提供多種接口,作為監(jiān)視器對(duì)象的類(lèi)需要實(shí)現(xiàn)相應(yīng)的接口,即實(shí)現(xiàn)響應(yīng)事件的方法。當(dāng)事件發(fā)生時(shí),系統(tǒng)內(nèi)設(shè)的handleEvent(Event evt)方法就自動(dòng)調(diào)用監(jiān)視器的類(lèi)實(shí)現(xiàn)的響應(yīng)事件的方法。
java.awt.event包中用來(lái)檢測(cè)并對(duì)事件做出反應(yīng)的模型包括以下三個(gè)組成元素:
源對(duì)象:事件“發(fā)生”這個(gè)組件上,它與一組“偵聽(tīng)”該事件的對(duì)象保持著聯(lián)系。
監(jiān)視器對(duì)象:一個(gè)實(shí)現(xiàn)預(yù)定義的接口的類(lèi)的一個(gè)對(duì)象,該對(duì)象的類(lèi)要提供對(duì)發(fā)生的事件作處理的方法。
事件對(duì)象:它包含描述當(dāng)事件發(fā)生時(shí)從源傳遞給監(jiān)視器的特定事件的信息。
一個(gè)事件驅(qū)動(dòng)程序要做的工作除創(chuàng)建源對(duì)象和監(jiān)視器對(duì)象之外,還必須安排監(jiān)視器了解源對(duì)象,或向源對(duì)象注冊(cè)監(jiān)視器。每個(gè)源對(duì)象有一個(gè)已注冊(cè)的監(jiān)視器列表,提供一個(gè)方法能向該列表添加監(jiān)視器對(duì)象。只有在源對(duì)象注冊(cè)了監(jiān)視器之后,系統(tǒng)才會(huì)將源對(duì)象上發(fā)生的事件通知監(jiān)視器對(duì)象。
3.事件類(lèi)型和監(jiān)視器接口
在java語(yǔ)言中,為了便于系統(tǒng)管理事件,也為了便于程序作監(jiān)視器注冊(cè),系統(tǒng)將事件分類(lèi),稱(chēng)為事件類(lèi)型。系統(tǒng)為每個(gè)事件類(lèi)型提供一個(gè)接口。要作為監(jiān)視器對(duì)象的類(lèi)必須實(shí)現(xiàn)相應(yīng)的接口,提供接口規(guī)定的響應(yīng)事件的方法。
再以程序響應(yīng)按鈕事件為例,JButton類(lèi)對(duì)象button可以是一個(gè)事件的激發(fā)者。當(dāng)用戶(hù)點(diǎn)擊界面中與button對(duì)應(yīng)的按鈕時(shí),button對(duì)象就會(huì)產(chǎn)生一個(gè)ActionEvent類(lèi)型的事件。如果監(jiān)視器對(duì)象是obj,對(duì)象obj的類(lèi)是Obj,則類(lèi)Obj必須實(shí)現(xiàn)AWT中的ActionListener接口,實(shí)現(xiàn)監(jiān)視按鈕事件的actionPerformed方法。button對(duì)象必須用addActionListener方法注冊(cè)它的監(jiān)視器obj。
程序運(yùn)行時(shí),當(dāng)用戶(hù)點(diǎn)擊button對(duì)象對(duì)應(yīng)的按鈕時(shí),系統(tǒng)就將一個(gè)ActionEvent對(duì)象從事件激發(fā)對(duì)象傳遞到監(jiān)視器。ActionEvent對(duì)象包含的信息包括事件發(fā)生在哪一個(gè)按鈕,以及有關(guān)該事件的其他信息。
下表給出有一定代表性的事件類(lèi)型和產(chǎn)生這些事件的部分Swing組件。實(shí)際事件發(fā)生時(shí),通常會(huì)產(chǎn)生一系列的事件,例如,用戶(hù)點(diǎn)擊按鈕,會(huì)產(chǎn)生ChangeEvent事件提示光標(biāo)到了按鈕上,接著又是一個(gè)ChangeEvent事件表示鼠標(biāo)被按下,然后是ActionEvent事件表示鼠標(biāo)已松開(kāi),但光標(biāo)依舊在按鈕上,最后是ChangeEvent事件,表示光標(biāo)已離開(kāi)按鈕。但是應(yīng)用程序通常只處理按下按鈕的完整動(dòng)作的單個(gè)ActionEvent事件。
每個(gè)事件類(lèi)型都有一個(gè)相應(yīng)的監(jiān)視器接口,表11-2列出了每個(gè)接口的方法。實(shí)現(xiàn)監(jiān)視器接口的類(lèi)必須實(shí)現(xiàn)所有定義在接口中的方法。
相關(guān)文章
詳解Springboot整合ActiveMQ(Queue和Topic兩種模式)
這篇文章主要介紹了詳解Springboot整合ActiveMQ(Queue和Topic兩種模式),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Spring?Data?JPA?在?@Query?中使用投影的方法示例詳解
這篇文章主要介紹了Spring?Data?JPA?在?@Query?中使用投影的方法,大家需要注意如果要在 @Query 中使用投影,必須要主動(dòng)聲明要查詢(xún)的字段,并且主動(dòng)寫(xiě)明字段的別名才行,本文通過(guò)sql代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-07-07基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)
下面小編就為大家?guī)?lái)一篇基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作
這篇文章主要介紹了Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11SpringCloud?Gateway中GatewayFilterChain執(zhí)行流程詳解
Spring?Cloud?Gateway旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的、統(tǒng)一的?API?路由管理方式。Spring?Cloud?Gateway?作為?Spring?Cloud?生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于?Filter?鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點(diǎn)和限流等2022-10-10Java動(dòng)態(tài)代理分析及簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Java動(dòng)態(tài)代理分析及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02