Java圖形化界面設計——容器(JFrame)

Java圖形化界面設計——容器(JFrame)

程序是爲了方便用戶使用的,因此實現圖形化界面的程序編寫是所有編程語言發展的必然趨勢,在命令提示符下運行的程序可以讓我們瞭解java程序的基本知識體系結構,現在就進入java圖形化界面編程。

 

一、Java基本類(JFC)

Java基本類(“Java FoundationClasses”,JFC),由一些軟件包組成。這些軟件包主要包括下面一些應用程序接口(API):
  ·抽象窗口工具集(AWT)(1.1及以上版本)。
  ·Swing構件。
  ·Java 2D應用程序接口(2D API)。
  ·兼容程序接口。
  上面列出的這些應用程序接口可難會出現在多個軟件包中。例如:2D API在Java.awt和Java.awt.image軟件包中都存在,雖然像Java.awt.geom等一些特殊的軟件包也支持2DAPI,但是大量的2D API類都存在於Java.awt軟件包中。
  AWT(1.1及以上版本)是JFC的核心。AWT爲JFC的構成提供了以下基本結構:
  ·代理事件模型。
  ·輕量構件。
  ·剪貼板和數據傳輸。
  ·打印和無鼠標操作。

 

1、AWTAbstract Window Toolkit(AWT)抽象窗口工具包

 

AWT是比較舊的雙介面函式庫,它依然高度倚賴各作業平臺自身所具備的繪圖功效機能,且用一個比包容程式(Wrapper)還小的設計還去除、吸收各作業平臺間的繪圖功能機能差異,以致Java程式在跨平臺移攜後的繪圖呈現不夠一致,這使得AWT遭受到衆多的批評。這意味着:AWT的Widget倚賴作業平臺自身原有的Widget功效機能,程式設計師在開發撰寫時必須去了解各作業平臺在Widget方面的差異性,如此便偏離了Java程式語言最初的宗旨:跨平臺一致性。

AWT由java.awt包提供,其提供了支持GUI設計的類和接口,而又AWT提供的組建一般稱之爲重量級組件,其是由本地方法來實現其功能的。AWT的特點:

AWT 中的圖形函數與操作系統所提供的圖形函數之間有着一一對應的關係

AWT 通過犧牲功能來實現其平臺無關性

AWT不能滿足圖形化用戶界面發展的需要

 

2、Swing包

爲了解決AWT組件的缺陷,特別是跨平臺的問題,在JDK1.2版本後提供了新的Swing包,有javax.swing提供,Swing是在AWT的基礎上構建的一套新的圖形界面組件,所有組建均是由java書寫,具有良好的跨平臺性,由於Swing沒有使用本地方法實現圖形功能,因此提出把Swing組件稱之爲輕量級組件。

注意:Swing組建是在AWT基礎上建立的,而不是替代AWT的,AWT是根基,Swing是發展。

Swing組件幾乎都是輕量組件,那些頂層容器:窗體,小應用程序、窗口和對話框除外。因爲輕量組件是在其容器的窗口中繪製的,而不是在自己的窗口中繪製的,所以輕量組件最終必須包含在一個重量容器中。因此,Swing的窗體、小應用程序、窗口和對話框都必須是重量組件,以便提供一個可以在其繪製Swing輕量組件的窗口。

 

Swing包括250多個類,其中有些是UI組件,有些是支持類。爲了把UI組件和支持類區分開,Swing組件的名字以J開頭。表1-1列出了Swing提供的J組件。用斜體字表示的組件是AWT組件的替代組件。

 

表1-1 Swing UI組件
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  組件類         描述
  ─────────────────────────────────
  JApplet Java.applet.Applet類的擴展,它含有JRootPane的一個實例
  JButton 能顯示文本和圖形的按鈕,它是AWT按鈕組件的替代組件
  JCheckBox 能顯示文本和圖形的複選框,它是AWT選擇組件的替代組件
  JCheckBoxMenuItem 一個複選框菜單項,它是AWT的複選框菜單項組件的替代組件
  JComboBox 帶下拉列表的文本框,它是AWT選擇組件的替代組件
  JComponent 所有輕量J組件的基類
  JDesktopPane 內部窗體的容器
  JDialog Swing對話框的基類,它擴展了AWT Dialot類
  JEditorPane 用於編輯文本的文本窗格
  JFrame 擴展java.awt.Frame的外部窗體
  JInternalFrame 在JDesktopPane中出現的內部窗體
  JLabel 可顯示文本和圖標的標籤,它是AWT標籤組件的替代組件
  JLayeredPane 能夠在不同層上顯示組件的容器
  JList 顯示選項列表的組件,它是AWT列表組件的替代組件
  JMenu 菜單條中顯示的一個菜單,它是AWT菜單組件的替代組件
  JMenuBar 用於顯示菜單的菜單條,它是AWT菜單條組件的替代組件
  JMenuItem 菜單項,它是AWT菜單項組件的替代組件
  JOptionPane 顯示標準的對話框,如:消息和問題對話框
  JPanel 通用容器,它是AWT面板和畫布組件的替代組件
  JPasswordfield JTextField的擴展,使輸入的字符不可見
  JPopupMenu 彈出式菜單,它是AWT彈出式菜單組件的替代組件
  JProgressBar 進度指示器
  JRadioButton 單選按鈕,它是AWT複選框組件的替代組件
  JRootPane 頂層容器,它包含一個玻璃窗格,一個層窗格,一個內容窗格和一個可選的菜單條
  JScrollBar 滾動條,它是AWT滾動條組件的替代組件
  JScrollPane 滾動窗格,它是AWT滾動窗格組件的替代組件
  JSeparator 水平或垂直分隔條
  JSlider 滑桿
  JSplitPane 有兩個分隔區的容器,這兩個分隔區可以水平排列或者垂直排列且分隔區的大小能自動調整
  JTabbedPane 帶選項卡的窗格
  JTable 表格
  JTableHeader 表格頭
  JTextArea 用於輸入多行文本的文本域,它是AWT文本域組件的替代組件
  JTestComponent 文本組件的基類,它替代AWT的TextComponent類
  JTextField 單行文本域,它替代AWT的單行文本域組件
  JTextPane 簡單的文本編輯器
  JToggleButton 兩種狀態的按鈕,它是JCheckBox和JRadioButton組件的基類
  JToolBar 工具條
  JToolTip 當光標停留在一個組件上時,該組件上顯示的一行文字
  JTree 用於按鈕層次組織數據的結構控件
  JViesport 用於瀏覽可滾動組件的視口
  JWindow 外部窗口,它是java.awt.Window的擴展
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  注:斜體字表示的是AWT的替代組件

 

二、AWT和Swing的區別

         AWT是Abstract Window ToolKit (抽象窗口工具包)的縮寫,這個工具包提供了一套與本地圖形界面進行交互的接口。AWT 中的圖形函數與操作系統所提供的圖形函數之間有着一一對應的關係,我們把它稱爲peers。 也就是說,當我們利用 AWT 來構件圖形用戶界面的時候,我們實際上是在利用操作系統所提供的圖形庫。由於不同操作系統的圖形庫所提供的功能是不一樣的,在一個平臺上存在的功能在另外一個平臺上則可能不存在。爲了實現Java語言所宣稱的"一次編譯,到處運行"的概念,AWT 不得不通過犧牲功能來實現其平臺無關性,也就是說,AWT 所提供的圖形功能是各種通用型操作系統所提供的圖形功能的交集。由於AWT 是依靠本地方法來實現其功能的,我們通常把AWT控件稱爲重量級控件。

 

Swing 是在AWT的基礎上構建的一套新的圖形界面系統,它提供了AWT所能夠提供的所有功能,並且用純粹的Java代碼對AWT 的功能進行了大幅度的擴充。例如說並不是所有的操作系統都提供了對樹形控件的支持, Swing 利用了AWT 中所提供的基本作圖方法對樹形控件進行模擬。由於 Swing 控件是用100%的Java代碼來實現的,因此在一個平臺上設計的樹形控件可以在其他平臺上使用。由於在Swing 中沒有使用本地方法來實現圖形功能,我們通常把Swing控件稱爲輕量級控件。

 

AWT和Swing之間的基本區別:AWT 是基於本地方法的C/C++程序,其運行速度比較快;Swing是基於AWT 的Java程序,其運行速度比較慢。對於一個嵌入式應用來說,目標平臺的硬件資源往往非常有限,而應用程序的運行速度又是項目中至關重要的因素。在這種矛盾的情況下,簡單而高效的AWT 當然成了嵌入式Java的第一選擇。而在普通的基於PC或者是工作站的標準Java應用中,硬件資源對應用程序所造成的限制往往不是項目中的關鍵因素,所以在標準版的Java中則提倡使用Swing,也就是通過犧牲速度來實現應用程序的功能。

 

簡要的講:

AWT 是抽象窗口組件工具包,是 java 最早的用於編寫圖形節目應用程序的開發包。

Swing 是爲了解決 AWT 存在的問題而新開發的包,它以 AWT 爲基礎的。

 

 

三、Swing基本框架


上圖列舉了AWT和 Swing的關係,也可以看出Swing是繼承自AWT的。本文主要利用Swing來設計圖形化界面程序。

 

四、圖形化設計步驟

 

圖形化界面程序大家都使用過,一般使用一個程序過程是:打開一個程序出現一個窗口或對話框,其中一般有菜單、工具欄、文本框、按鈕、單選框、複選框等控件(組件也就是控件),用戶錄入相關數據,點按相關菜單、按鈕,程序對數據進行相關處理,並將處理後的數據顯示或者保存起來,最後關閉程序。

用java編程的相關設計步驟來分解上面的的程序運行過程如下圖所示:

 

1、  創建頂層容器

對應於程序的初始顯現窗口,窗口中放入其它菜單、工具欄、文本框、按鈕等組件

頂層容器圖形化界面顯示的基礎,其它所有的組件(控件)都是直接或間接顯示在頂層容器中的。在java中頂層容器有三種,分別是JFrame(框架窗口,即通常的窗口)、JDialog(對話框)、JApplet(用於設計嵌入在網頁中的java小程序)。

2、  創建中間容器、組件

對應於程序中出現的菜單、工具欄(中間容器)、文本框、按鈕、單選框、複選框等控件。

有很多Swing組件可以使用,見前面的Swing UI組件表。

3、  將組件加入容器

在java中創建組件後,還需要將組件放入相應的容器,才能在頂層容器,如窗口中顯示出組件。

4、  設置容器內組件的位置

組件添加到容器中,還必須設置好組件的顯示位置,一般有兩種方法來設置組建的顯示位置,一是按照與容器的相對距離(以像素爲單位),精確固定控件的位置;二是用佈局管理器來管理組件在容器內的位置。

5、  處理組件所產生的事件

即用戶執行選擇菜單、單擊按鈕等操作時,就要執行相應的命令,進行相關的程序處理,這就需要設置組件的事件。

 

五、組件容器的使用

Java中組件容器包含頂層容器和中間容器。

在java中頂層容器有三種,分別是JFrame(框架窗口,即通常的窗口)、JDialog(對話框)、JApplet(用於設計嵌入在網頁中的java小程序),頂層容器是容納其它組件的基礎,即設計圖形化程序必須要有頂層容器。

 

Java中間容器是可以包含其它相應組件的容器,但是中間容器和組件一樣,不能單獨存在,必須依附於頂層容器。

常見的中間容器有:

•    JPanel:最靈活、最常用的中間容器。

•    JScrollPane:與 JPanel 類似,但還可在大的組件或可擴展組件周圍提供滾動條。

•    JTabbedPane:包含多個組件,但一次只顯示一個組件。用戶可在組件之間方便地切換。

•    JToolBar:按行或列排列一組組件(通常是按鈕)。

 

1、JFrame 框架窗口的使用



         以上是JFrame的常用方法即說明,下面舉例說明。

 

實例1:直接定義Jframe 類的對象創建一個窗口

// JFrameDemo1.java

import javax.swing.*;     //使用Swing類,必須引入Swing包

public class JFrameDemo1{

  public staticvoid main( String args[]) {

         //定義一個窗體對象f,窗體名稱爲"一個簡單窗口"        

         Jframe  f = new JFrame("一個簡單窗口");

         /*設置窗體左上角與顯示屏左上角的座標,

離顯示屏上邊緣300像素,離顯示屏左邊緣300像素     */

         f.setLocation(300, 300);           //f.setLocationRelativeTo(null);本語句實現窗口居屏幕中央

         f.setSize(300,200);            //設置窗體的大小爲300*200像素大小

         f.setResizable(false);       //設置窗體是否可以調整大小,參數爲布爾值

         //設置窗體可見,沒有該語句,窗體將不可見,此語句必須有,否則沒有界面就沒有如何意義了

f.setVisible( true);   

//用戶單擊窗口的關閉按鈕時程序執行的操作

         f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);

 }

}

 

程序運行結果如下圖所示:

可以根據程序代碼的註釋,依次修改相應的方法參數查看效果。

setDefaultCloseOperation(int operation):設置用戶在此窗體上發起 "close" 時默認執行的操作。方法中的參數解釋如下:

l  爲“0”或DO_NOTHING_ON_CLOSE:

(在 WindowConstants 中定義):不執行任何操作;要求程序在已註冊的WindowListener 對象的 windowClosing 方法中處理該操作。

比如實例程序代碼中更改爲f.setDefaultCloseOperation(f. DO_NOTHING_ON_CLOSE);或者f.setDefaultCloseOperation(0),然後查看效果,可以發現窗口無法關閉,下面是相同用法,不再解釋了。

l  爲“1”或HIDE_ON_CLOSE

調用任意已註冊的 WindowListener 對象後自動隱藏該窗體。此時沒有關閉程序,只是將程序界面隱藏了。

可以打開任務管理器,可以看到一個叫“java.exe”的進程(如果調試運行了多個java程序,則會看到多個“java.exe”的進程),如果此時用EditPlus測試程序,會發現當單擊窗口的關閉按鈕關閉窗口後,卻無法再次對程序進行調試,因爲程序線程沒有關閉,在任務管理器中關閉java.exe(如果有多個“java.exe”的進程,則先都關閉掉,再來測試該問題)基礎後,EditPlus纔可以重新編譯改程序。

l  爲“2”或DISPOSE_ON_CLOSE

調用任意已註冊 WindowListener 的對象後自動隱藏並釋放該窗體。但繼續運行應用程序,釋放了窗體中佔用的資源。

l  爲“3”EXIT_ON_CLOSE(在 JFrame 中定義):使用 System exit 方法退出應用程序。僅在應用程序中使用。結束了應用程序。

 

默認情況下,該值被設置爲 HIDE_ON_CLOSE。

當註釋掉實例中的f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);語句時,起到的效果和f.setDefaultCloseOperation(f. HIDE_ON_CLOSE); 或者f.setDefaultCloseOperation(1);一樣。

 

實例2:創建類繼承JFrame類創建一個窗口

 

// JFrameDemo2.java

importjavax.swing.*;     

//創建子類MyFrame繼承父類JFrame

class MyFrameextends JFrame{

//定義構造函數,帶有四個參數,用於設置窗口位置和大小

  MyFrame(int x,int y,int h,int w){

     super("一個簡單窗口");       //重寫父類方法,爲窗口定義標題

    /*以下的方法調用前面沒有添加對象名,也不可能添加,要創建的對象名稱是什麼都不知道,也就不可能添加。但是創建對象後,對象自動獲取這些初始值。*/

setLocation(x,y);

     setSize(h,w);

     setResizable(false);

     setVisible(true);

     setDefaultCloseOperation(EXIT_ON_CLOSE);

   }

}

publicclass  JFrameDemo2{

  public static void main( String args[]) {

         //實例化類對象,提示設置參數

         MyFrame f = new MyFrame(300,300,300,200);

  }

}

 

上面的例子也可以不使用構造函數,可以和實例一方式一樣,代碼可以改爲如下模式。

實例3:一個簡單窗口

// JframeDemo3.java

importjavax.swing.*;              

class MyFrameextends JFrame{

  MyFrame(){

   }

}

publicclass  JframeDemo3{

  public static void main( String args[]) {

         MyFrame f = new MyFrame();

         f.setTitle("一個簡單窗口");

         f.setLocationRelativeTo(null);

         f.setSize(300,200);

         f.setResizable(false);

         f.setVisible( true);

         f.setDefaultCloseOperation(3);

  }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章