跳转到内容

事件和按钮

50% developed
来自维基教科书,开放世界中的开放书籍


在上一页中,我们创建了一个应用程序,它被动地显示一条“Hello, world”消息。然而,这很快就会变得无聊。在本章中,我们将讨论 swing 事件并了解 JButton 类,我们将构建一个包含 JButtonJLabel 的小型应用程序,并使用它来介绍布局的概念。

事件 是 Swing 工作方式的基础部分。用户在各个组件上的操作会导致组件触发各种类型的事件。其他 Java 对象可以注册为任何组件的事件监听器,它们对这些组件的事件感兴趣。为了成为监听器,对象必须实现相应的监听器接口(例如,ActionListener 用于操作事件,FocusListener 用于焦点事件等),该接口包含在事件被触发时调用的方法。

在 Java 中,事件本身是对象,是事件类的实例。事件类位于 java.awt.eventjavax.swing.event 包中。一些常见的事件类有

  • ActionEvent - 由一些对象触发的(有点通用的)事件,包括 JButtons
  • MouseEvent - 当用户使用鼠标执行某些操作时触发,例如单击、拖动或更一般的移动
  • KeyEvent - 当用户按下、释放或更一般地说在键盘上键入时触发

为了了解事件的使用方式,我们将研究 JButtons,以便我们可以构建一个示例。

JButton 是一个组件,它与 JLabel 一样,可以包含文本、图像或两者兼而有之。但是,正如我们所期望的,它还具有用户可以通过单击它来“按下”它的属性,这会导致它触发事件(具体来说是操作事件)。在这个例子中,我们将或多或少地重做我们之前的例子,除了我们将添加一个 JButton。在下一节中,我们将添加功能,以便按下按钮可以执行某些操作。

以下是创建之前“Hello, world”应用程序以及屏幕底部按钮的代码

左侧代码创建的窗口
Computer code 带按钮的 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 对象,它控制组件的布局方式,并且不同的布局管理器以不同的方式布局其组件。布局管理器的几个例子是 GridLayoutCardLayoutBorderLayout。最后一个是 JFrame 的默认布局管理器(尽管我们可以使用其 setLayout() 方法更改组件的布局管理器)。虽然布局管理器将在后面的章节中更详细地介绍,但我们在这里要说的是,BorderLayout 管理器将它们的空間分成五个区域,每个区域都与 BorderLayout 类中的一个常量相关联。这些常量(解释了这些区域)是

  • BorderLayout.NORTH,
  • BorderLayout.SOUTH,
  • BorderLayout.EAST,
  • BorderLayout.WEST
  • BorderLayout.CENTER.

如果您要将组件添加到使用 BorderLayout 的容器中,您可以将这些常量之一作为可选的第二个参数传递给 add() 方法以指定组件应该放置的位置。如果没有指定常量,布局管理器默认情况下将新组件放置在中心。我建议您尝试之前的示例并更改布局参数,并观察效果。


Clipboard

待办事项
添加屏幕截图。


Clipboard

待办事项
使用分开的示例。


华夏公益教科书