更新時間:2022-06-14 10:46:36 來源:動力節(jié)點 瀏覽1630次
Java 在 1995 年推出時取得的一大進步是包含了標準化的“圖形用戶界面”(“GUI”)庫。這是一個巨大的飛躍,超越了令人眼花繚亂的不兼容第三方庫,這些第三方庫是以前對 GUI 開發(fā)人員開放的唯一途徑。Java GUI 庫也是最早使用當時全新的設(shè)??計模式語言明確描述其架構(gòu)的主要軟件包之一。
然而,Java GUI 系統(tǒng)的一個令人困惑的方面是一個遺留問題,該系統(tǒng)在 1997 年進行了大規(guī)模升級,因此涉及的一些類分布在(相對)較舊的 java.awt包和較新的javax.swing 包中. 一般來說,如果類名以“ J ”開頭,那么它在 Swing 包中。由于某些功能在 Swing 包中似乎是重復的,例如框架和按鈕, 因此當有選擇時,請始終使用 Swing 組件而不是較舊的 AWT 組件。
java.awt - 包含 GUI 組件的主要超類以及一些實用程序類型類,例如 Color和Point。
java.awt.event -- 包含用于管理來自 GUI 組件的事件的類和接口,例如按鈕單擊和鼠標移動。
javax.swing -- 包含大部分可見的 GUI 組件,例如按鈕、文本字段、框架和面板。
Java 使用 復合設(shè)計模式來創(chuàng)建 GUI 組件,這些組件也可以用作容納更多 GUI 組件的容器。這是一個 UML 圖,顯示了一些更常用的 GUI 組件之間的類關(guān)系:
上圖中,常用的容器組件為橙色,非容器組件為藍色。請注意,從技術(shù)上講,所有javax.swing組件都能夠容納其他Components,但實際上,只有JFrame、 JApplet和JPanel以及上面未顯示的一些(JSplitPane、JTabbedPane 和JScrollPane)通常用于此目的。
Java GUI 子系統(tǒng)由一個獨立的、自動的任務(wù)執(zhí)行線程組成,稱為“事件循環(huán)”。每個影響 GUI 的動作,例如調(diào)用重新繪制屏幕或操作 GUI 組件的屬性,或者是 GUI 發(fā)生某些事情的結(jié)果,例如用戶單擊鼠標或按下鍵,都封裝在表單中放入隊列中以供事件循環(huán)處理的“事件”。處理事件的結(jié)果可能是對屏幕上顏色位的操作,也可能導致調(diào)用開發(fā)人員代碼中的方法。
如果我們查看處理按鈕單擊的過程,我們會看到用戶的鼠標單擊觸發(fā)了一系列事件。按鈕對象通過創(chuàng)建放置到事件隊列中的按鈕單擊事件來響應(yīng)鼠標單擊。事件循環(huán)在空閑時會選擇該事件并對其進行處理。按鈕單擊事件的處理涉及調(diào)用在專門注冊的對象上的方法,這些對象稱為“偵聽器”,這些對象正在“偵聽”單擊事件。按鈕單擊的偵聽器是實現(xiàn) java.awt.ActionListener接口的對象,并且按鈕單擊事件處理涉及調(diào)用偵聽器的actionPerformed 方法,開發(fā)人員已實現(xiàn)該方法以在單擊該特定按鈕時執(zhí)行所需的任何操作。請注意,可以將多個偵聽器“添加”到任何給定按鈕,并且按鈕單擊處理將依次調(diào)用每個 ActionListener的 actionPerformed方法。
另一方面,如果我們查看繪制過程,假設(shè)開發(fā)人員的代碼希望調(diào)用重新繪制屏幕上的框架組件。開發(fā)人員的代碼將調(diào)用幀的 repaint()方法,但所做的只是生成一個 repaint 事件,該事件與所有其他事件一起放入事件隊列中。當事件循環(huán)能夠執(zhí)行時,它會處理重繪事件,在此過程中,GUI 子系統(tǒng)將生成一個特殊的 java.awt.Graphics實例,用于表示計算機的物理屏幕。此Graphics對象作為輸入?yún)?shù)傳遞給對框架的 paintComponent方法的調(diào)用。(技術(shù)上,系統(tǒng)調(diào)用框架的paint()方法依次調(diào)用 paintComponent(),但我們不需要擔心。)由于框架是一個容器,它就像任何好的復合設(shè)計模式實現(xiàn)一樣,依次調(diào)用 它所有子的paintComponent方法-成分。如果其中一個組件本身就是一個容器,那么繪制過程會沿著復合樹向下級聯(lián),直到每個組件都有機會在屏幕上繪制自己(Graphics 對象)。開發(fā)人員可以通過簡單地覆蓋所需組件的paintComponent方法來插入自定義繪制操作。
簡單組件
javax.swing.JLabel -- 屏幕上一段不可編輯的文本。
javax.swing.JButton -- 可以單擊的按鈕。單擊該按鈕將觸發(fā)其actionPerformed 事件,該事件將調(diào)用所有已安裝 ActionListener的actionPerformed 方法。
javax.swing.JTextField -- 一行用戶可編輯的文本。
javax.swing.JTextArea -- 顯示多行文本的框。可以設(shè)置為可編輯或不可編輯。
javax.swing.JRadioButton , javax.swing.JCheckBox -- 可以單擊的小圓形或方形框以指示選擇某些內(nèi)容,例如某種選項。單擊單選按鈕或復選框?qū)⒂|發(fā)特定類型的事件。 可以使用名為javax.swing.ButtonGroup的不可見(對用戶)類將單選按鈕組合在一起,以創(chuàng)建一個集合,其中一次只能設(shè)置一個按鈕。
javax.swing.JComboBox -- 項目的下拉列表。JComboBox 包含一組Objects而不僅僅是Strings。顯示的文本是項目的toString() 方法的返回值。因此,JComboBox可用于保存任意實體,而 GUI 不知道這些實體是什么。僅當所選項目更改時才會觸發(fā)事件,但始終可以檢索當前所選項目及其索引。
容器組件
javax.swing.JFrame - 一個獨立的“窗口”或“框架”,帶有標題和通常的移動、調(diào)整大小、最小化、最大化和關(guān)閉功能。對于大多數(shù)人來說,這是他們系統(tǒng)中的頂級容器。因此,一個JFrame不能容納另一個JFrame。雖然 JFrame可以包含任何類型的組件,但通常,JFrame包含 JPanels,它們被安排為將窗口(框架)中使用的組件集組合在一起。JFrame的默認布局管理器是 BorderLayout。JFrame有 幾個獨特而重要的方法值得指出:
void getContentPane().add(Component c) -- 向框架添加一個組件。請注意, 這里JFrame的行為與JPanel略有不同 ,因為 JFrame有一個很少使用的功能,即多層(窗格)組件可以快速切換到可見性和不可見性。 從java.awt.Container繼承的此方法有一些重寫形式,允許傳遞布局管理器的參數(shù),例如指定組件在 BorderLayout中的位置。
void setDefaultCloseOperation(int option) -- 設(shè)置框架關(guān)閉時的行為。請參閱有關(guān)關(guān)閉 JFrame 時設(shè)置行為的網(wǎng)頁。
javax.swing.JApplet -- 允許 Java 程序作為網(wǎng)頁中的組件運行。請注意,applet 和框架不是同一事物并且不可互換,盡管有一些解決方法允許相同的代碼作為獨立應(yīng)用程序或網(wǎng)頁中的 applet 運行。
javax.swing.JPanel -- 用于在框架中或其他面板內(nèi)部布置組件的基本構(gòu)建塊。一個 JAva GUI 由一個框架和一個面板組成,面板包含面板,等等。請注意,這里的“面板”也可以是滾動窗格、拆分窗格和/或選項卡式窗格(見下文)。JPanel的默認布局管理器 是FlowLayout。
javax.swing.JScrollPane -- 允許您顯示單個面板,其側(cè)面帶有滾動條,允許顯示比屏幕上容納的更多或更大的組件。
javax.swing.JSplitPane -- 允許顯示兩個面板,使用垂直或水平的用戶可移動條將它們分開。
javax.swing.JTabbedPane -- 允許以“選項卡式”格式顯示多個面板。
GUI 容器中常用的方法
void add(Component c) -- 將另一個組件添加到容器中,以根據(jù)當前安裝的布局管理器進行布局。 從java.awt.Container繼承的此方法有一些重寫形式,允許傳遞布局管理器的參數(shù),例如指定組件在 BorderLayout中的位置。
void setLayout(LayoutManager lm) -- 將新的布局管理器安裝到容器中。
所有 GUI 組件中的常用方法
void setPreferredSize(int width, int height) -- 設(shè)置當布局管理器能夠使用該尺寸時使用的組件的尺寸,例如有足夠的空間。一些布局管理器總是忽略組件的大小設(shè)置,因為大小受其他約束。
String getText() , void setText(String s) -- 標簽、按鈕、文本字段和文本區(qū)域的文本訪問器方法。
void setBackground(Color c) -- 設(shè)置組件的背景顏色。
實用程序類
java.awt.Graphics——這個抽象類很少被開發(fā)者的代碼實例化。 在屏幕繪制過程中,此類的與機器相關(guān)的實例被傳遞給可見 GUI 組件的paintComponent它不是由開發(fā)人員的代碼實例化,而是由 Java GUI 子系統(tǒng)實例化。開發(fā)人員可以編寫代碼,使用提供的Graphics對象實例在屏幕上繪制線條、形狀和圖像。對于高級圖形工作,應(yīng)注意提供的Graphics 對象始終可以安全地向下轉(zhuǎn)換為功能更強大的 java.awt.Graphcs2D類。
永遠不要直接從您自己的代碼中調(diào)用paintComponent 。同樣,永遠不要實例 化圖形對象——Java GUI 系統(tǒng)會自動將您的代碼交給它需要的圖形對象。
java.awt.Color -- 表示顏色。具有預定義為常見顏色的靜態(tài)字段,并且可以以多種不同格式表示,例如 3 位 RGB 值。
java.awt.Point -- 表示二維平面上的一個點,由整數(shù)值笛卡爾坐標指定。具有檢索x 和y坐標的字段以及用于計算兩點之間距離等操作的方法。對于 浮點值笛卡爾坐標,請使用 java.awt.geom.Point2D類。
Java 容器使用 策略設(shè)計模式來實現(xiàn) GUI 組件在屏幕上的自動布局管理。包含組件的大小和位置的管理委托給“布局管理器”,可以在設(shè)計時設(shè)置或動態(tài)更改。以下是一些常見的布局:
java.awt.BorderLayout -- 將組件分成 5 個不同的區(qū)域,邊緣的 4 個不可調(diào)整大小的區(qū)域(“North”、“East”、“South”和“West”)和中心的 1 個可調(diào)整大小的區(qū)域(“中心”)。 每個區(qū)域只能包含 1 個組件,因此通常在每個區(qū)域中使用面板來容納多個組件。
將組件添加到已知已 安裝BorderLayout的容器的典型語句是
myContainer.add(myComponent, BorderLayout.NORTH);
java.awt.FlowLayout -- 將多個組件保持在水平排列的行中,如果容器的寬度太小,則會環(huán)繞。將 FlowLayout不需要任何其他參數(shù)——組件將按照添加順序從左到右顯示。
javax.swing.BoxLayout -- 以垂直或水平排列的方式固定組件,與容器的大小無關(guān)。包含的組件的寬度和高度都是相同的,并且會自動設(shè)置為完全填充容器。
Java 使用 Observer-Observable 設(shè)計模式 來處理來自 GUI 組件的事件,例如按鈕單擊和鼠標移動。組件提供了添加各種類型監(jiān)聽器的方法,例如“ void addActionListener(ActionListener al)”和“ void addMouseMotionListener(MouseMotionListener mml) ”。可以添加多個偵聽器,并在相關(guān)事件發(fā)生時調(diào)用所有偵聽器,但不能保證已安裝偵聽器的調(diào)用順序。
java.awt.event.ActionListener -- 用于檢測組件上的簡單操作的接口,例如單擊按鈕或 在文本字段上Enter
java.awt.event.MouseListener -- 用于監(jiān)聽鼠標點擊事件的事件監(jiān)聽器的接口。此事件允許比 ActionListener事件更詳細地捕獲鼠標單擊,例如,區(qū)分按下鼠標按鈕與. 鼠標按鈕釋放事件。還提供了一個方便類 MouseAdapter,它不對所有方法進行操作,從而使開發(fā)人員可以只編寫覆蓋所需方法的代碼。
java.awt.event.MouseMotionListener -- 用于事件偵聽器的接口,用于監(jiān)視鼠標運動事件,例如拖動。還提供了一個方便類 MouseMotionAdapter,它不對所有方法進行操作,從而使開發(fā)人員可以只編寫覆蓋所需方法的代碼。
通常,只要顯示第一個 GUI 組件(可見性設(shè)置為 true),就會啟動基于 GUI 的程序。通常這將是系統(tǒng)中的一個框架,因此會有如下一行代碼:
myFrame.setVisible(true);
這是一個 GUI 程序的快速入門, 主要方法如下:
公共靜態(tài)無效主要(字符串[]參數(shù)){
java.awt.EventQueue.invokeLater(new Runnable() {
公共無效運行(){
嘗試 {
(new MyFrameClass("標題")).setVisible(true);
} 捕捉(異常 e){
e.printStackTrace();
}
}
});
}
(注意:上面的代碼正確地實例化了官方 Java 要求中指定的 GUI 線程上的框架。代碼可以通過使用 lambda 函數(shù)而不是匿名內(nèi)部類實現(xiàn)來簡化一點Runnable。)
然而,在 模型-視圖-控制器架構(gòu)中,不建議通過簡單地將其可見性設(shè)置為true來啟動視圖,即主框架。最好在框架或主視圖類上定義一個“ start() ”方法,其中執(zhí)行所有最終初始化和檢查,其 最后一行代碼是setVisible(true) 語句。
MVC 中的典型控制器將實例化模型和視圖,并將它們與各自的適配器連接在一起。完成所有這些之后,控制器的最后一步將是調(diào)用視圖的start方法。如果大家想了解更多相關(guān)知識,可以關(guān)注一下動力節(jié)點的Java在線學習,里面的課程內(nèi)容細致全面,很適合零基礎(chǔ)的小伙伴學習,希望對大家能夠有所幫助。