前言
人是視覺動物(誤) 感性的物種,擁有獨自的喜好,看順眼與不順眼都很主觀,但唯一相同的是直覺性地操作工具,當接觸到未知的工具時,總是從看得見得開始摸索,並慢慢發覺隱藏在背後的功能,最後可以非常靈活使用工具。
程式設計師生產出來的產品也是一樣,如果一個系統只能使用文字介面操作,那它的使用對象一定是"工程師",一般使用者可不買單這種純文字的操作,操作一個功能還要查找要使用那個命令,這實在是太麻煩了!
圖形使用者介面(Graphical User Interface, GUI)是指採用圖形方式顯示的電腦操作用戶介面。與早期電腦使用的命令列介面相比,圖形介面對於使用者來說在視覺上更易於接受,以「各種美觀、而不單調的視覺訊息」提示使用者「狀態的改變」,勢必比純文字來得精彩。
一、Swing 簡介
Swing 是 Java 為圖形介面應用開發提供的一組工具包,是 Java 基礎類別的一部分。Swing 包含了建構圖形介面(GUI)的各種元件,如:視窗、標籤、按鈕、文字框等。
Swing 提供了許多比 AWT(使用C語言開發) 更好的螢幕顯示元素,使用純 Java 實現,能夠更好的兼容跨平台運行。
為了和 AWT 元件區分,Swing 元件在 javax.swing.* 套件包下,類別名稱均以 J 開頭,例如:JFrame、JLabel、JButton 等。
二、Swing 元件
一個 Java 的圖形介面由各種不同類型的「元素」組成,例如:視窗、選單、對話框、標籤、按鈕、文字框等,這些元素統一被稱為元件(Component)。元件按照不同的功能,可分為頂層容器、中間容器、基本元件。一個簡單視窗的組成,如下層級結構所示:
- 頂層容器
- 選單
- 中間容器
- 基本元件
元件類型的繼承關係:
- 頂層容器 屬於視窗類別元件,繼承自 java.awt.Window。
- 中間容器和基本元件繼承自 javax.swing.JComponent。
頂層容器
頂層容器屬於視窗類別元件,可以獨立顯示,一個圖形介面至少需要一個視窗,例如:
元件 | 描述 |
---|---|
JFrame | 一個普通的視窗(絕大多數 Swing 圖形介面程序使用 JFrame 作為頂層容器) |
JDialog | 對話框 |
中間容器
中間容器充當基本元件的載體,不可獨立顯示。中間容器可以添加若干基本元件(也可以嵌套添加中間容器),對容器內的組件進行管理,類似於給各種複雜的元件進行分組管理。最頂層的一個中間容器必須依托在頂層容器(視窗)內。
常用的中間容器(面板):
元件 | 描述 |
---|---|
JPanel | 一般輕量級面板容器元件 |
JScrollPane | 滾動窗格,可以水平和垂直滾動的面板元件 |
JSplitPane | 分隔窗格 |
JTabbedPane | 標籤式窗格 |
JLayeredPane | 分層窗格 |
基本元件
基本元件是直接實現人機交互的元件。
常用的簡單的基本元件:
元件 | 描述 |
---|---|
JLabel | 標籤 |
JButton | 按鈕 |
JRadioButton | 單選按鈕 |
JCheckBox | 複選框 |
JToggleButton | 開關按鈕 |
JTextField | 文字框 |
JPasswordField | 密碼框 |
JTextArea | 文字區塊 |
JComboBox | 下拉式選單 |
JList | 清單(列表) |
JProgressBar | 進度條 |
JSlider | 滑動條 |
選取器元件:
元件 | 描述 |
---|---|
JFileChooser | 文件選取器 |
JColorChooser | 顏色選取器 |
其他較為複雜的基本元件:
元件 | 描述 |
---|---|
JTable | 表格 |
JTree | 樹 |
三、佈局管理器
把 Swing 的各種元件(JComponent)添加到面板容器中(JPanel),需要給面板容器指定佈局管理器(LayoutManager)。
常用的佈局管理器:
元件 | 描述 |
---|---|
FlowLayout | 流動式的版面,按元件加入的順序,按水平方向排列,排滿一行換一行繼續排列 |
GridLayout | 網格的版面,把 Container 按指定行列數分隔出若干網格,每一個網格按順序放置一個元件 |
GridBagLayout | 可合併的網格版面,按網格劃分 Container,每個元件可占用一個或多個網格,可將元件垂直、水平或沿它們的基準線對齊 |
BoxLayout | 盒(箱)式版面,將 Container 中的多個元件按水平或垂直的方式排列 |
GroupLayout | 分組版面,將元件按層次分組(串行或並行),分別確定元件組在水平和垂直方向上的位置 |
CardLayout | 卡片版面,將 Container 中的每個元件看做一張卡片,一次只能顯示一張卡片,默認顯示第一張卡片 |
BorderLayout | 邊界版面,把 Container 按方位分為 5 個區域(東、西、南、北、中),每個區域放置一個元件 |
SpringLayout | 彈性版面,通過定義元件四條邊的座標位置來實現佈局 |
null | 絕對版面,通過設置元件在 Container 中的座標位置來放置元件 |
範例:先建立一個視窗,並加入其它視窗元件
建立 CtoF 類別,繼承 JFrame 類別。
建立 SwingDemo 類別,啟動圖形介面。
建立出一個視窗,裡頭有標籤、文字框和按鈕元件。目前此按鈕是沒有任何作用的,我們需要加入監聽事件才能有反應。
四、監聽事件
Java 的事件處理是採用「委派模式(delegation pattern)」,委派事件是指當事件發生時,產生事件的物件會把此訊息轉給「事件傾聽者(Event Listener)」處理的方式。
事件處理模式:
(i) 事件來源(Event Source):視窗、按鈕、選單等等
(ii) 事件(Event):此類別有提供相關動作以了解事件來源的相關資訊
(iii) 事件傾聽者(Event Listener):對每個明確事件的發生,都相應地定義一個明確的 Java 方法
(iv) 事件處理物件(Event Handler):必須包含處理事件的動作設計
下表為事件類別、事件傾聽者介面與傾聽者介面裡所提供的方法:
事件類別 | 傾聽者介面 | 傾聽者介面所提供的事件處理者 |
---|---|---|
ActionEvent | ActionListener | actionPerformed(ActionEvent e) |
AdjustmentEvent | AdjustmentListener | adjustmentValueChanged(AdjustmentEvent e) |
ItemEvent | ItemListener | ItemStateChanged(ItemEvent e) |
KeyEvent | KeyListener | KeyTyped(KeyEvent e) KeyPressed(KeyEvent e) KeyReleased(KeyEvent e) |
MouseEvent | MouseListener MouseMotionListener |
mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) |
TextEvent | TextListener | textValueChanged(TextEvent e) |
WindowEvent | WindowListener | windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e) |
下表為元件可能觸發事件類別的對應關係:
事件來源者 | 發生事件的類別型態 |
---|---|
JButton | ActionEvent |
JCheckBox | ActionEvent ItemEvent |
JComponent | ComponentEvent FocusEvent KeyEvent MouseEvent |
MenuItem | ActionEvent |
Scrollbar | AdjustmentEvent |
TextArea | ActionEvent |
TextField | ActionEvent |
Window | WindowEvent |
範例:為按鈕註冊 ActionListener 事件傾聽者,計算攝氏溫度轉華氏溫度
增加事件傾聽者至 CtoF 類別,且「不繼承 JFrame 類別」創建圖形介面。
修改 SwingDemo 類別,只使用匿名物件
|
五、總結
簡單介紹 Swing 圖形介面,其內容真的很多,只能自己多實作相關的圖形使用者介面(Graphical User Interface, GUI)慢慢增進對 Swing 的瞭解。
Swing 圖形介面分為「頂層容器」、「中間容器」和「基本元件」,並使用佈局管理器(LayoutManager)設定版面。一個頁面是一個頂層容器,而中間容器內可以塞入很多個中間容器或基本元件,而基本元件不能再塞入任何元件。
監聽事件是圖形介面與使用者中間互動的橋樑,圖形介面中如果沒有監聽事件,那麼這個頁面就是靜態的(純文字頁面),如果有監聽事件,那麼它是動態的,有生命力的!
「JAVA SE 入門教學」在此篇文章中告一段落,這些文章都是我成為 Java 程式設計師的養分,在這些基礎的概念上,一而再、再而三的閱讀,地基打穩後就可以往上開始蓋高樓大廈啦!
沒有留言:
張貼留言