Swing 快速指南



Swing - 概述

Swing API 是一套可擴充套件的 GUI 元件,旨在簡化開發人員建立基於 JAVA 的前端/GUI 應用程式的工作。它構建在 AWT API 之上,並作為 AWT API 的替代品,因為它幾乎擁有與 AWT 控制元件相對應的所有控制元件。Swing 元件遵循模型-檢視-控制器架構以滿足以下條件。

  • 單個 API 必須足以支援多種外觀和感覺。

  • API 必須是模型驅動的,因此最高級別的 API 不需要擁有資料。

  • API 必須使用 Java Bean 模型,以便構建工具和 IDE 可以為開發人員提供更好的服務。

MVC 架構

Swing API 架構遵循如下所示的鬆散的 MVC 架構。

  • 模型表示元件的資料。

  • 視圖表示元件資料的視覺化表示。

  • 控制器接收使用者在檢視上的輸入,並反映元件資料的變化。

  • Swing 元件將模型作為單獨的元素,而檢視和控制器部分則組合在使用者介面元素中。因此,Swing 具有可插拔的外觀和感覺架構。

Swing 特性

  • **輕量級** - Swing 元件獨立於本地作業系統的 API,因為 Swing API 控制元件主要使用純 JAVA 程式碼而不是底層作業系統呼叫來呈現。

  • **豐富的控制元件** - Swing 提供了一套豐富的先進控制元件,例如樹、選項卡窗格、滑塊、顏色選擇器和表格控制元件。

  • **高度可定製** - Swing 控制元件可以很容易地定製,因為視覺外觀獨立於內部表示。

  • **可插拔的外觀和感覺** - 基於 SWING 的 GUI 應用程式的外觀和感覺可以在執行時根據可用值進行更改。

Swing - 環境設定

本節指導您如何在計算機上下載和設定 Java。請按照以下步驟設定環境。

Java SE 可從以下連結免費獲取 下載 Java。因此,您可以根據您的作業系統下載相應的版本。

按照說明下載 Java 並執行 **.exe** 檔案以在您的計算機上安裝 Java。在計算機上安裝 Java 後,您需要設定環境變數以指向正確的安裝目錄。

為 Windows 2000/XP 設定路徑

假設您已將 Java 安裝在 **c:\Program Files\java\jdk** 目錄中 -

**步驟 1** - 右鍵單擊“我的電腦”,然後選擇“屬性”。

**步驟 2** - 在“高階”選項卡下單擊“環境變數”按鈕。

**步驟 3** - 修改“Path”變數,使其也包含 Java 可執行檔案的路徑。例如,如果路徑當前設定為 **'C:\WINDOWS\SYSTEM32'**,則將路徑更改為 **'C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin'**。

為 Windows 95/98/ME 設定路徑

假設您已將 Java 安裝在 **c:\Program Files\java\jdk** 目錄中 -

**步驟 1** - 編輯 **'C:\autoexec.bat'** 檔案,並在末尾新增以下行:**'SET PATH=%PATH%;C:\Program Files\java\jdk\bin'**。

為 Linux、UNIX、Solaris、FreeBSD 設定路徑

應將環境變數 PATH 設定為指向 Java 二進位制檔案安裝的位置。如果您遇到問題,請參考您的 Shell 文件。

例如,如果您使用 **bash** 作為您的 shell,則您需要在 **'.bashrc: export PATH=/path/to/java:$PATH'** 末尾新增以下行。

常用的 Java 編輯器

要編寫 Java 程式,您需要一個文字編輯器。市場上甚至還有更復雜的 IDE 可用。但就目前而言,您可以考慮以下其中一種 -

  • **記事本** - 在 Windows 機器上,您可以使用任何簡單的文字編輯器,如記事本(本教程推薦)、TextPad。

  • **Netbeans** - Netbeans 是一個開源且免費的 Java IDE,可以從 https://www.netbeans.org/index.html 下載。

  • **Eclipse** - Eclipse 也是由 Eclipse 開源社群開發的 Java IDE,可以從 https://www.eclipse.org/ 下載。

Swing - 控制元件

每個使用者介面都考慮以下三個主要方面 -

  • **UI 元素** - 這些是使用者最終看到並與之互動的核心可視元素。GWT 提供了大量廣泛使用和常見的元素,從基本到複雜,我們將在本教程中介紹。

  • **佈局** - 它們定義了 UI 元素如何在螢幕上組織,併為 GUI(圖形使用者介面)提供最終的外觀和感覺。這部分將在佈局章節中介紹。

  • **行為** - 這些是使用者與 UI 元素互動時發生的事件。這部分將在事件處理章節中介紹。

UI classes

每個 Swing 控制元件都繼承自以下元件類層次結構的屬性。

序號 類和描述
1 Component

Component 是 Swing 非選單使用者介面控制元件的抽象基類。Component 代表具有圖形表示的物件

2 Container

Container 是可以包含其他 Swing 元件的元件

3 JComponent

JComponent 是所有 Swing UI 元件的基類。為了使用繼承自 JComponent 的 Swing 元件,該元件必須位於其根為頂級 Swing 容器的包含層次結構中

Swing UI 元素

以下是使用 Swing 設計 GUI 時常用的控制元件列表。

序號 類和描述
1 JLabel

JLabel 物件是用於在容器中放置文字的元件。

2 JButton

此類建立一個帶標籤的按鈕。

3 JColorChooser

JColorChooser 提供一組控制元件窗格,旨在允許使用者操作和選擇顏色。

4 JCheckBox

JCheckBox 是一個圖形元件,可以處於 **開啟** (true) 或 **關閉** (false) 狀態。

5 JRadioButton

JRadioButton 類是一個圖形元件,可以處於 **開啟** (true) 或 **關閉** (false) 狀態,在一個組中。

6 JList

JList 元件向用戶呈現一個可滾動的文字項列表。

7 JComboBox

JComboBox 元件向用戶呈現一個顯示選項選單的選擇。

8 JTextField

JTextField 物件是一個文字元件,允許編輯單行文字。

9 JPasswordField

JPasswordField 物件是一個專門用於密碼輸入的文字元件。

10 JTextArea

JTextArea 物件是一個文字元件,允許編輯多行文字。

11 ImageIcon

ImageIcon 控制元件是 Icon 介面的實現,用於從影像繪製圖標

12 JScrollbar

Scrollbar 控制元件代表一個捲軸元件,以便使用者可以從一系列值中進行選擇。

13 JOptionPane

JOptionPane 提供一組標準對話方塊,用於提示使用者輸入值或告知使用者某些資訊。

14 JFileChooser

JFileChooser 控制元件表示一個對話方塊視窗,使用者可以在其中選擇檔案。

15 JProgressBar

隨著任務進展到完成,進度條會顯示任務的完成百分比。

16 JSlider

JSlider 允許使用者透過在有界區間內滑動旋鈕來以圖形方式選擇值。

17 JSpinner

JSpinner 是一個單行輸入欄位,允許使用者從有序序列中選擇數字或物件值。

Swing - 事件處理

在本章中,您將學習事件及其型別,還將學習如何處理事件。本章末尾提供了示例,以便更好地理解。

什麼是事件?

物件狀態的變化稱為 **事件**,即事件描述了源狀態的變化。事件是由於使用者與圖形使用者介面元件互動而生成的。例如,單擊按鈕、移動滑鼠、透過鍵盤輸入字元、從列表中選擇專案和滾動頁面是導致事件發生的活動。

事件型別

事件大致可分為兩類 -

  • **前臺事件** - 這些事件需要使用者的直接互動。它們是由於一個人與圖形使用者介面中的圖形元件互動而產生的結果。例如,單擊按鈕、移動滑鼠、透過鍵盤輸入字元、從列表中選擇專案、滾動頁面等。

  • **後臺事件** - 這些事件需要終端使用者的互動。作業系統中斷、硬體或軟體故障、計時器到期和操作完成是一些後臺事件的示例。

什麼是事件處理?

事件處理是控制事件並決定事件發生時應發生什麼的機制。此機制具有稱為事件處理程式的程式碼,該程式碼在事件發生時執行。

Java 使用委託事件模型來處理事件。此模型定義了生成和處理事件的標準機制。

委託事件模型具有以下關鍵參與者。

  • **源** - 源是發生事件的物件。源負責向其處理程式提供已發生事件的資訊。Java 為源物件提供了類。

  • **監聽器** - 也稱為事件處理程式。監聽器負責生成對事件的響應。從 Java 實現的角度來看,監聽器也是一個物件。監聽器等待直到收到事件。一旦收到事件,監聽器就會處理事件然後返回。

這種方法的好處是使用者介面邏輯與生成事件的邏輯完全分離。使用者介面元素能夠將事件的處理委託給單獨的程式碼。

在此模型中,需要將監聽器註冊到源物件,以便監聽器可以接收事件通知。這是一種高效的事件處理方式,因為事件通知僅傳送給希望接收它們的那些監聽器。

事件處理涉及的步驟

**步驟 1** - 使用者單擊按鈕並生成事件。

**步驟 2** - 自動建立相關事件類的物件,並且有關源和事件的資訊將填充到同一個物件中。

**步驟 3** - 事件物件被轉發到已註冊監聽器類的的方法。

**步驟 4** - 方法被執行並返回。

關於監聽器的要點

  • 為了設計監聽器類,您必須開發一些監聽器介面。這些監聽器介面預測一些公共抽象回撥方法,這些方法必須由監聽器類實現。

  • 如果您沒有實現任何預定義的介面,那麼您的類就不能充當源物件的監聽器類。

回撥方法

這些是由 API 提供者提供的、由應用程式程式設計師定義並由應用程式開發人員呼叫的方法。這裡的回撥方法表示事件方法。響應事件,Java JRE 將觸發回撥方法。所有這些回撥方法都在監聽器介面中提供。

如果元件希望某些監聽器監聽其事件,則源必須將自身註冊到監聽器。

事件處理示例

使用您選擇的任何編輯器,在D:/ > SWING > com > tutorialspoint > gui >目錄下建立以下Java程式。

SwingControlDemo.java

package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SwingControlDemo {
   private JFrame mainFrame;
   private JLabel headerLabel;
   private JLabel statusLabel;
   private JPanel controlPanel;

   public SwingControlDemo(){
      prepareGUI();
   }
   public static void main(String[] args){
      SwingControlDemo swingControlDemo = new SwingControlDemo();  
      swingControlDemo.showEventDemo();       
   }
   private void prepareGUI(){
      mainFrame = new JFrame("Java SWING Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));

      headerLabel = new JLabel("",JLabel.CENTER );
      statusLabel = new JLabel("",JLabel.CENTER);        
      statusLabel.setSize(350,100);
      
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      controlPanel = new JPanel();
      controlPanel.setLayout(new FlowLayout());

      mainFrame.add(headerLabel);
      mainFrame.add(controlPanel);
      mainFrame.add(statusLabel);
      mainFrame.setVisible(true);  
   }
   private void showEventDemo(){
      headerLabel.setText("Control in action: Button"); 

      JButton okButton = new JButton("OK");
      JButton submitButton = new JButton("Submit");
      JButton cancelButton = new JButton("Cancel");

      okButton.setActionCommand("OK");
      submitButton.setActionCommand("Submit");
      cancelButton.setActionCommand("Cancel");

      okButton.addActionListener(new ButtonClickListener()); 
      submitButton.addActionListener(new ButtonClickListener()); 
      cancelButton.addActionListener(new ButtonClickListener()); 

      controlPanel.add(okButton);
      controlPanel.add(submitButton);
      controlPanel.add(cancelButton);       

      mainFrame.setVisible(true);  
   }
   private class ButtonClickListener implements ActionListener{
      public void actionPerformed(ActionEvent e) {
         String command = e.getActionCommand();  
         
         if( command.equals( "OK" ))  {
            statusLabel.setText("Ok Button clicked.");
         } else if( command.equals( "Submit" ) )  {
            statusLabel.setText("Submit Button clicked."); 
         } else {
            statusLabel.setText("Cancel Button clicked.");
         }  	
      }		
   }
}

使用命令提示符編譯程式。進入D:/ > SWING目錄,然後輸入以下命令。

D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java

如果未出現錯誤,則表示編譯成功。使用以下命令執行程式。

D:\AWT>java com.tutorialspoint.gui.SwingControlDemo

驗證以下輸出。

SWING  Event Handling

Swing - 事件類

事件類表示事件。Java提供了各種事件類,但這裡只討論最常用的幾種。

EventObject 類

它是所有事件狀態物件都應從中派生的根類。所有事件都使用對物件的引用(即)來構造,該物件在邏輯上被認為是事件最初發生的物件。此類在java.util包中定義。

類宣告

以下是java.util.EventObject類的宣告:

public class EventObject
   extends Object
      implements Serializable

欄位

以下是java.util.EventObject類的欄位:

protected Object source − 事件最初發生的物件。

類建構函式

序號 建構函式和說明
1

EventObject(Object source)

構造一個原型事件。

類方法

序號 方法和說明
1

Object getSource()

事件最初發生的物件。

2

String toString()

返回此EventObject的字串表示形式。

繼承的方法

此類繼承自以下類的方法:

  • java.lang.Object

Swing 事件類

以下是常用事件類的列表。

序號 類和描述
1 AWTEvent

它是所有Swing事件的根事件類。此類及其子類取代了原來的java.awt.Event類。

2 ActionEvent

單擊按鈕或雙擊列表項時會生成ActionEvent。

3 InputEvent

InputEvent類是所有元件級輸入事件的根事件類。

4 KeyEvent

輸入字元時會生成KeyEvent。

5 MouseEvent

此事件表示元件中發生了滑鼠操作。

6 WindowEvent

此類的物件表示視窗狀態的更改。

7 AdjustmentEvent

此類的物件表示可調整物件發出的調整事件。

8 ComponentEvent

此類的物件表示視窗狀態的更改。

9 ContainerEvent

此類的物件表示視窗狀態的更改。

10 MouseMotionEvent

此類的物件表示視窗狀態的更改。

11 PaintEvent

此類的物件表示視窗狀態的更改。

Swing - 事件監聽器

事件監聽器表示負責處理事件的介面。Java提供了各種事件監聽器類,但這裡只討論最常用的幾種。事件監聽器方法的每個方法都有一個引數,該引數是一個EventObject類的子類的物件。例如,滑鼠事件監聽器方法將接受MouseEvent的例項,其中MouseEvent派生自EventObject。

EventListener 介面

這是一個標記介面,每個監聽器介面都必須擴充套件它。此類在java.util包中定義。

類宣告

以下是java.util.EventListener介面的宣告:

public interface EventListener

Swing 事件監聽器介面

以下是常用事件監聽器的列表。

序號 類和描述
1 ActionListener

此介面用於接收操作事件。

2 ComponentListener

此介面用於接收元件事件。

3 ItemListener

此介面用於接收專案事件。

4 KeyListener

此介面用於接收鍵盤事件。

5 MouseListener

此介面用於接收滑鼠事件。

6 WindowListener

此介面用於接收視窗事件。

7 AdjustmentListener

此介面用於接收調整事件。

8 ContainerListener

此介面用於接收容器事件。

9 MouseMotionListener

此介面用於接收滑鼠移動事件。

10 FocusListener

此介面用於接收焦點事件。

Swing - 事件介面卡

介面卡是用於接收各種事件的抽象類。這些類中的方法是空的。這些類作為建立監聽器物件的便捷方式而存在。

Swing 介面卡

以下是監聽Swing中GUI事件時常用的介面卡列表。

序號 介面卡和說明
1 FocusAdapter

一個用於接收焦點事件的抽象介面卡類。

2 KeyAdapter

一個用於接收鍵盤事件的抽象介面卡類。

3 MouseAdapter

一個用於接收滑鼠事件的抽象介面卡類。

4 MouseMotionAdapter

一個用於接收滑鼠移動事件的抽象介面卡類。

5 WindowAdapter

一個用於接收視窗事件的抽象介面卡類。

Swing - 佈局

佈局是指容器內元件的排列方式。換句話說,佈局就是在容器中將元件放置在特定位置。佈局管理器自動完成佈局控制元件的任務。

佈局管理器

佈局管理器自動將所有元件放置在容器內。即使不使用佈局管理器,元件仍然由預設佈局管理器進行定位。可以手動佈局控制元件,但是由於以下兩個原因,這會變得非常困難。

  • 處理容器中的大量控制元件非常繁瑣。

  • 通常,在需要排列元件時,不會給出元件的寬度和高度資訊。

Java提供了各種佈局管理器來定位控制元件。大小、形狀和排列等屬性因佈局管理器而異。當小程式或應用程式視窗的大小發生變化時,元件的大小、形狀和排列也會相應地發生變化,即佈局管理器會適應小程式檢視器或應用程式視窗的尺寸。

佈局管理器與每個容器物件相關聯。每個佈局管理器都是實現LayoutManager介面的類的物件。

以下是定義佈局管理器功能的介面。

序號 介面和說明
1 LayoutManager

LayoutManager介面聲明瞭其物件將充當佈局管理器的類需要實現的方法。

2 LayoutManager2

LayoutManager2是LayoutManager的子介面。此介面適用於那些知道如何根據佈局約束物件佈局容器的類。

AWT 佈局管理器類

以下是使用AWT設計GUI時常用的控制元件列表。

序號 佈局管理器和說明
1 BorderLayout

BorderLayout將元件排列在五個區域中:東、西、北、南和中心。

2 CardLayout

CardLayout物件將容器中的每個元件視為一張卡片。一次只能看到一張卡片。

3 FlowLayout

FlowLayout是預設佈局。它按方向流佈局元件。

4 GridLayout

GridLayout以矩形網格的形式管理元件。

5 GridBagLayout

這是最靈活的佈局管理器類。GridBagLayout的物件垂直、水平或沿基線對齊元件,而無需元件大小相同。

6 GroupLayout

GroupLayout以分層方式對元件進行分組,以便將它們定位在容器中。

7 SpringLayout

SpringLayout根據一組約束來定位其關聯容器的子項。

Swing - 選單類

我們知道每個頂級視窗都關聯著一個選單欄。此選單欄包含終端使用者可用的各種選單選項。此外,每個選項都包含一個選項列表,稱為下拉選單。選單和MenuItem控制元件是MenuComponent類的子類。

選單層次結構

Swing Menu Hiearchy

選單控制元件

序號 類和描述
1 JMenuBar

JMenuBar物件與頂級視窗相關聯。

2 JMenuItem

選單中的專案必須屬於JMenuItem或其任何子類。

3 JMenu

JMenu物件是從選單欄顯示的下拉選單元件。

4 JCheckboxMenuItem

JCheckboxMenuItem是JMenuItem的子類。

5 JRadioButtonMenuItem

JRadioButtonMenuItem是JMenuItem的子類。

6 JPopupMenu

JPopupMenu可以在元件內的指定位置動態彈出。

Swing - 容器

容器是Swing GUI元件的組成部分。容器提供一個元件可以放置的空間。AWT中的容器本身就是一個元件,它提供了將元件新增到自身的功能。以下是一些需要注意的事項。

  • 容器的子類稱為容器。例如,JPanel、JFrame和JWindow。

  • 容器只能將元件新增到自身。

  • 每個容器中都存在一個預設佈局,可以使用setLayout方法覆蓋它。

Swing 容器

以下是使用Swing設計GUI時常用的容器列表。

序號 容器和說明
1 面板

JPanel是最簡單的容器。它提供了一個空間,可以在其中放置任何其他元件,包括其他面板。

2 框架

JFrame是一個帶有標題和邊框的頂級視窗。

3 視窗

JWindow物件是一個沒有邊框和選單欄的頂級視窗。

廣告