事件和按钮
在上一页中,我们创建了一个应用程序,它被动地显示一条“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()
方法以指定组件应该放置的位置。如果没有指定常量,布局管理器默认情况下将新组件放置在中心。我建议您尝试之前的示例并更改布局参数,并观察效果。