AWT概述 GUI全稱是Graphical User Interface,即圖形用戶界面,即應用程式提供給用戶操作的圖形界面,包括視窗、菜單、按鈕、工具欄和其它各種圖形界面元素 GUI設計提供了豐富的類庫,這些類分別位於java.awt和javax.swing包中,簡稱為AWT和Swing Swin ...
AWT概述
GUI全稱是Graphical User Interface,即圖形用戶界面,即應用程式提供給用戶操作的圖形界面,包括視窗、菜單、按鈕、工具欄和其它各種圖形界面元素
GUI設計提供了豐富的類庫,這些類分別位於java.awt和javax.swing包中,簡稱為AWT和Swing
Swing不僅實現了AWT中的所有功能,而且提供了更加豐富的組件和功能,足以滿足GUI設計的一切需求。
AWT事件處理
事件處理機制
事件處理機制專門用於響應用戶的操作,比如,想要響應用戶的點擊滑鼠、按下鍵盤等操作,就需要使用AWT的事件處理機制
常用事件分類
窗體事件
WindowEvent用於表示這些窗體事件,在應用程式中,當對窗體事件進行處理時,首先需要定義一個類實現WindowListener介面作為窗體監聽器,然後通過addWindowListener()方法將窗體對象與窗體監聽器綁定
滑鼠事件
MouseEvent類用於表示滑鼠事件,幾乎所有的組件都可以產生滑鼠事件,滑鼠事件包括滑鼠按下、滑鼠鬆開、滑鼠單擊等。
對滑鼠事件的處理可通過實現MouseListener介面或者繼承適配器MouseAdapter類,然後調用addMouseListener()方法將監聽器綁定到事件源對象
鍵盤事件
鍵盤操作也是最常用的用戶交互方式,例如鍵盤按下、釋放等,這些操作被定義為鍵盤事件
KeyEvent類表示鍵盤事件,處理KeyEvent事件的監聽器對象需要實現KeyListener介面或者繼承KeyAdapter類。
動作事件
在Java中,動作事件用ActionEvent類表示,處理ActionEvent事件的監聽器對象需要實現ActionListener介面,但監聽器對象在監聽動作時,不會像滑鼠事件一樣處理滑鼠個別的移動和單擊的細節,而是去處理“按鈕按下”這樣“有意義”的事件。
佈局管理器
FlowLayout流式佈局管理器
使用FlowLayout佈局管理器時,容器會將組件按照添加順序從左向右放置。當到達容器的邊界時,會自動將組件放到下一行的開始位置。這些組件可以左對齊、居中對齊(預設方式)或右對齊的方式排列
BorderLayout邊界佈局管理器
是一種較為複雜的佈局方式,它將容器劃分為五個區域,分別是東(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。組件可以被放置在這五個區域的中任意一個。
GridLayout網格佈局管理器
使用縱橫線將容器分成n行m列大小相等的網格,每個網格中放置一個組件。
GridBagLayout網格包佈局管理器
與GridLayout佈局管理器類似,不同的是,它允許網格中的組件大小各不相同,而且允許一個組件跨越一個或者多個網格。
CardLayout卡式佈局管理器
將界面看做一系列卡片,在任何時候只有其中一張卡片是可見的,這張卡片占據容器的整個區域。
BoxLayout盒子佈局管理器
不使用佈局管理器
如果不希望通過佈局管理器對容器進行佈局,可以調用容器的setLayout(null)方法,將佈局管理器取消。
不使用佈局管理器時,程式必須調用容器中每個組件的setSize()和setLocation()方法或者是setBounds()方法(這個方法接收四個參數,分別是左上角的x、y坐標和組件的長、寬)來為這些組件在容器中定位
Swing
編程理念
MVC模式
模型M(數據)和視圖V(顯示)分離,通過控制器C將二者鬆散耦合在一起
觀察者模式
迪米特法則
監聽器(介面回調)
匿名內部類(就地實例化介面對象)
視窗類實現監聽器介面並重寫回調方法
內部類實現監聽器介面並重寫回調方法
創建內部類對象作為一個或多個控制項的監聽器
內部類可以訪問外部類的私有成員(控制項)
預設適配器
MouseListener / MouseMotionListener / MouseWheelListener
MouseAdapter
KeyListener
KeyAdapter
WindowListener
WindowAdapter
視窗
JFrame
JFrame和Frame一樣是一個獨立存在的頂級視窗,不能放置在其它容器之中,JFrame支持通用視窗所有的基本功能,例如視窗最小化、設定視窗大小等等
JDialog
JDialog是Swing的另外一個頂級視窗,它和Dialog一樣都表示對話框
JDialog對話框可分為兩種:模態對話框和非模態對話框。
非模態對話框
允許用戶在處理對話框的同時與其它視窗交互
模態對話框
指用戶需要等到處理完對話框後才能繼續與其它視窗交互
JInternalFrame多文檔視窗(子視窗)
JWindow無邊框的視窗
中間容器
JPanel
和AWT中的Panel組件使方法基本一致,它是一個無邊框,不能被移動、放大、縮小或者關閉的面板,它的預設佈局管理器是FlowLayout。當然也可以使用構造函數JPanel(LayoutManager layout)或者它的setLayout()方法為其制定佈局管理器。
JScrollPane帶滾動條
帶有滾動條的面板容器,而且這個面板只能添加一個組件,如果想往JScrollPane面板中添加多個組件,應該先將組件添加到JPanel中,然後將JPanel添加到JScrollPane中
JSplitPane帶分割條
JTabbedPane帶頁簽(選項卡)
JDesktopPane可以放子視窗
文本組件
用於接收用戶輸入的信息或向用戶展示信息,其中包括文本框(JTextField)、文本域(JTextArea)等,它們都有一個共同父類 JTextComponent,JTextComponent是一個抽象類,它提供了文本組件常用的方法
JTextComponent 類有兩個子類,分別是JTextField和JTextArea
JTextField:稱為文本框,它只能接收單行文本的輸入
JTextArea:JTextArea稱為文本域,它能接收多行的文本的輸入
按鈕組件
常見的按鈕組件有JButton、JCheckBox、JRadioButton等,它們都是抽象類AbstractButton類的直接或間接子類
JCheckBox組件被稱為覆選框,它有選中(是)/未選中(非)兩種狀態,如果用戶想接收的輸入只有“是”和“非”,則可以通過覆選框來切換狀態。如果覆選框有多個,則用戶可以選中其中一個或者多個。
JRadioButton組件被稱為單選按鈕,與JCheckBox覆選框不同的是,單選按鈕只能選中一個,就像收音機上的電臺選擇按鈕,當按下一個,先前按下的按鈕就會自動彈起,對於JRadioButton按鈕來說,當一個按鈕被選中時,先前被選中的按鈕就會自動取消選中。
JComboBox
被稱為組合框或者下拉列表框,它將所有選項摺疊收藏在一起,預設顯示的是第一個添加的選項。當用戶點擊組合框時,會出現下拉式的選擇列表,用戶可以從中選擇其中一項並顯示。
菜單組件
菜單組件分為下拉式菜單和彈出式菜單
下拉式菜單包括JMenuBar(菜單欄)、JMenu(菜單)和JMenuItem(菜單項)
JMenuBar:表示一個水平的菜單欄,它用來管理菜單,不參與同用戶的互動式操作。
JMenu:表示一個菜單,它用來整合管理菜單項。菜單可以是單一層次的結構,也可以是多層次的結構。
JMenuItem:JMenuItem表示一個菜單項,它是菜單系統中最基本的組件。和JMenu菜單一樣,在創建JMenuItem菜單項時,通常會使用 JMenumItem(String text)這個構造方法為菜單項指定文本內容
創建下拉式菜單的步驟如下所示:
1、創建一個JMenuBar菜單欄對象,將其放置在JFrame視窗的頂部
2、創建JMenu菜單對象,將其添加到JMenuBar菜單欄中
3、創建JMenuItem菜單項,將其添加到JMenu菜單中
在Java的Swing組件中,彈出式菜單用JPopupMenu表示
JPopupMenu彈出式菜單和下拉式菜單一樣都通過調用add()方法添加JMenuItem菜單項,但它預設是不可見的,如果想要顯示出來,則必須調用它的show(Component invoker,int x,int y)方法
常用控制項
基本控制項
JLabel標簽
Icon
Font
JButton按鈕
JTextField文本框
JPasswordField密碼框
JRadioButton單選按鈕ButtonGroup
JCheckBox覆選框
JCombBox下拉列表ListCellRender
JList列表ListCellRender
JTextArea文本域
JOptionPane彈出式模態對話框
JFileChooser文件選擇器
JColorChooser顏色選擇器
高級控制項
JMenu菜單JMenuItem菜單項
JPopupMenu上下文菜單(右鍵菜單)JMenuItem菜單項
JToolBar工具欄
JEditorPane編輯面板
JProgressBar進度條
JSlider滑動條
JSpinner微調器
JTable表格TableCellRender
JTree樹TreeCellRender
AWT繪圖
update(Graphics g)
repaint()
paint(Graphics g)
Swing繪圖
paintComponent(Graphics g)
paintBorder(Graphics g)
paintChildren(Graphics g)