事件和按鈕
在上一頁中,我們建立了一個應用程式,它被動地顯示一條“Hello, world”訊息。然而,這很快就會變得無聊。在本章中,我們將討論 swing 事件並瞭解 JButton 類,我們將構建一個包含 JButton 和 JLabel 的小型應用程式,並使用它來介紹佈局的概念。
事件 是 Swing 工作方式的基礎部分。使用者在各個元件上的操作會導致元件觸發各種型別的事件。其他 Java 物件可以註冊為任何元件的事件監聽器,它們對這些元件的事件感興趣。為了成為監聽器,物件必須實現相應的監聽器介面(例如,ActionListener 用於操作事件,FocusListener 用於焦點事件等),該介面包含在事件被觸發時呼叫的方法。
在 Java 中,事件本身是物件,是事件類的例項。事件類位於 java.awt.event 和 javax.swing.event 包中。一些常見的事件類有
ActionEvent- 由一些物件觸發的(有點通用的)事件,包括 JButtonsMouseEvent- 當用戶使用滑鼠執行某些操作時觸發,例如單擊、拖動或更一般的移動KeyEvent- 當用戶按下、釋放或更一般地說在鍵盤上鍵入時觸發
為了瞭解事件的使用方式,我們將研究 JButtons,以便我們可以構建一個示例。
JButton 是一個元件,它與 JLabel 一樣,可以包含文字、影像或兩者兼而有之。但是,正如我們所期望的,它還具有使用者可以透過單擊它來“按下”它的屬性,這會導致它觸發事件(具體來說是操作事件)。在這個例子中,我們將或多或少地重做我們之前的例子,除了我們將新增一個 JButton。在下一節中,我們將新增功能,以便按下按鈕可以執行某些操作。
以下是建立之前“Hello, world”應用程式以及螢幕底部按鈕的程式碼

帶按鈕的 Swing 應用程式
import javax.swing.*;
import java.awt.BorderLayout; // The BorderLayout class
// lives in java.awt. We
// use its constants to tell
// the JFrame where we want the
// components to go.
// expanded version of the hello application,
// but with a button below.
public class HelloWithButton {
public static void main(String[] args) {
// construct the JLabel,
// an overloaded version of the constructor
// allows us to specify the alignment off the
// bat
JLabel label = new JLabel
("Hello, World!", SwingConstants.CENTER);
// create the button. The text in the
// constructor will be visible on the
// button.
JButton button = new JButton("Button");
// create the frame
JFrame frame = new JFrame("Hello");
// add the label and the button to the
// frame, using layout constants.
frame.add(label, BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.toFront();
}
}
|
您應該看到一個框架出現,其中包含文字“Hello, World!”在中心,以及一個標籤為“Button”的按鈕在底部。您可以單擊按鈕,但它不會執行任何操作。
在這個例子中,我們不僅將元件新增到框架中,還指定了它們應該放置的位置。每個包含其他元件的元件都有一個 LayoutManager 物件,它控制組件的佈局方式,並且不同的佈局管理器以不同的方式佈局其元件。佈局管理器的幾個例子是 GridLayout、CardLayout 和 BorderLayout。最後一個是 JFrame 的預設佈局管理器(儘管我們可以使用其 setLayout() 方法更改元件的佈局管理器)。雖然佈局管理器將在後面的章節中更詳細地介紹,但我們在這裡要說的是,BorderLayout 管理器將它們的空間分成五個區域,每個區域都與 BorderLayout 類中的一個常量相關聯。這些常量(解釋了這些區域)是
BorderLayout.NORTH,BorderLayout.SOUTH,BorderLayout.EAST,BorderLayout.WEST和BorderLayout.CENTER.
如果您要將元件新增到使用 BorderLayout 的容器中,您可以將這些常量之一作為可選的第二個引數傳遞給 add() 方法以指定元件應該放置的位置。如果沒有指定常量,佈局管理器預設情況下將新元件放置在中心。我建議您嘗試之前的示例並更改佈局引數,並觀察效果。
