[Java进阶] Swing两万字大总结二

🔥一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去🎶
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🦄 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Java入门
🌠 首发时间:2022年5月31日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦

🐱 向窗体中添加容器

窗体作为容器,单独使用时是没有意义的,需要向窗体中添加各种组件,从而实现其功能。面板也是一个 Swing 容器,因此可以容纳其他组件。面板不能像窗体一样单独使用,必须添加到其他容器中才能发挥作用。接下来我们来看一下 Swing 中的几种常用面板控件。

🐶 普通面板:JPanel

JPanel 面板继承自 java.awt.Container 类,它可以聚集一些组件进行布局。因此,它除了可以添加组件之外,也可以设置布局管理器,为面板中的组件布局。

下面让我们通过一个实例来看看 JPanel 的应用。
要求:在项目中创建 JPanelFrame 类,该类继承 JFrame 类成为窗体组件,然后在该类中创建 4Jpanel 面板组件,并将他们添加到窗体中。

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

public class JPanelFrame extends JFrame {
    JPanel p1,p2,p3,p4;

    public JPanelFrame(String title) {
        super(title);

        //将整个容器设置为两行两列的网格布局
        setLayout(new GridLayout(2,2,2,2));

        //初始化面板,设置边界布局
        p1 = new JPanel(new BorderLayout());
        p2 = new JPanel(new BorderLayout());
        p3 = new JPanel(new BorderLayout());
        p4 = new JPanel(new BorderLayout());

        //在各面板中添加按钮
        p1.add(new JButton("p1"));
        p2.add(new JButton("p2"));
        p3.add(new JButton("p3"));
        p4.add(new JButton("p4"));

        //在容器中添加面板
        add(p1);
        add(p2);
        add(p3);
        add(p4);

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 260, 260);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new JPanelFrame("JPanel");
    }
}

运行该实例,结果如下:
在这里插入图片描述

🐶 滚动面板:JScrollPane

在设置界面时,可能会遇到在一个较小的容器窗体中显示一段较多内容的情况,这时可以使用 JScrollPane 面板。

JScrollPane 面板是带滚动条的面板,也是一种容器,它只能放置一个组件,并且不可以使用布局管理器。如果需要在 JScrollPane 面板中放置多个组件,我们可以将多个组件放置在 JPanel 面板上,然后将 JPanel 面板作为一个整体组件添加在 JScrollPane 组件上。

下面让我们通过一个实例来了解 JScrollPane 的应用。
要求:在项目中创建 JScrollPaneFrame 类,该类继承 JFrame 类成为窗体组件,然后在类中创建 JScrollPane 滚动面板组件,该滚动面板组件包含 JTextArea 文本域组件。

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

public class JScrollPaneFrame extends JFrame {
    JPanel root;
    JTextArea textArea;
    JScrollPane scrollPane;

    public JScrollPaneFrame(String title) {
        super(title);

        //创建文本域
        textArea = new JTextArea(30, 50);

        //创建JScrollPane面板对象
        scrollPane = new JScrollPane(textArea);

        //将该面板添加到容器中
        add(scrollPane);

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new JScrollPaneFrame("JScrollPane");
    }
}

运行该实例,结果如下:
在这里插入图片描述

🐶 分割面板:JSplitPane

分割面板可以将所在的区域分割成两部分,分开的部分之间有一分隔条,用户可以根据需要调整分隔条的位置来改变这两部分的相对大小,并且分割条两侧的每一部分中还可以再放入分割面板,实现分割面板的嵌套使用。

此外,分割面板还可以实现水平方向上的分割或者垂直方向上的分割,这样用户就可以根据需要选择是在水平方向上进行分割,还是在垂直方向上进行分割。

分割面板不像 JPanelJScrollPane 面板使用起来那么简单,因为使用分割面板时,需要设置分割面板是水平方向分割还是垂直方向分割等属性。

① 创建分割面板
我们使用 javax.swing.JSplitPane 类来创建一个分割面板对象。该类的常用方法如下表所示:

构造方法功能
JSplitPane()创建一个在水平方向进行分割、无连续布局、为组件使用两个按钮的分割面板
JSplitPane(int orient)创建一个在指定方向进行分割且无连续布局的分割面板
JSplitPane(int orient, Component leftC, Component rightC)创建一个在指定方向进行分割、不连续重绘的指定组件的分割面板

从上表我们可以看出,JSplitPane 的构造方法中包含有参数 orient,该参数用于指定分割面板的分割方向。

JSplitPane 类的分割方向说明如下表所示:
字段| 描述
JSplitPane.HORIZONTAL_SPLIT | 表示在水平方向上对分割面板进行分割
JSplitPane.VERTICAL_SPLIT | 表示在垂直方向上对分割面板进行分割

创建分割面板对象,示例代码如下:

JSplitPane splitPane1 = new JSplitPane();
JSplitPane splitPane1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
JSplitPane splitPane2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

② 使用分割面板
JSplitPane 创建的对象是一个分割面板,JSplitPane 类提供了一些方法,可以完成分割面板的常用操作。

该类的常用方法如下表所示:

方法描述
getBottomComponent()返回分隔条下面或右边的组件
getDividerSize()返回分隔条的大小
getLeftComponent()返回分隔条左边或上面的组件
getRightComponent()返回分隔条右边或下面的组件
getTopComponent()返回分隔条上面或左边的组件
remove(Component comp)移除窗格中的子组件 comp
setBottonComponent(Component comp)将组件设置到分隔条的下面或右边

下面我们来创建一个分割面板对象并使用它,示例代码如下:

import javax.swing.*;

public class JSplitPaneFrame extends JFrame {
    JSplitPane splitPane1;
    JButton topButton, bottomButton;

    public JSplitPaneFrame(String title) {
        super(title);

        //创建水平分割面板
        splitPane1 = new JSplitPane();

        //创建按钮
        topButton = new JButton("顶部按钮");
        bottomButton = new JButton("底部按钮");

        //在分割面板中添加按钮
        splitPane1.setTopComponent(topButton);
        splitPane1.setBottomComponent(bottomButton);

        //设置分割面板显示UI小部件
        splitPane1.setOneTouchExpandable(true);

        add(splitPane1);

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    public static void main(String args[]) {
        new JSplitPaneFrame("JSplitPane");
    }
}

运行该实例,结果如下:
在这里插入图片描述

这个例子首先创建了一个在水平方向进行分割、无连续布局、包含有两个按钮的分割面板,然后把右侧的分割面板设置为在垂直方向进行分割的分割面板,接着创建了两个按钮,并把这两个按钮放分别放到水平分割面板的左部和右部。

注意
使用分割面板可以将窗体分割成两个部分,但只能是两个部分,也就是各部分之间只能添加一个组件,要想进行扩充,可以在面板中再添加面板组件。

下面我们再来看一个比较复杂的实例,创建窗体,在该类中创建一个水平分割面板和一个垂直分割面板,并在水平分割面板的左侧及垂直分割面板的上面和下面各放一个标签,然后把垂直分割面板放到水平分割面板的右侧。

import javax.swing.*;

public class JSplitPaneFrame extends JFrame {
    JSplitPane hsplitPane,vsplitPane;
    JButton leftButton;
    JLabel topLabel,bottomLabel;

    public JSplitPaneFrame(String title) {
        super(title);

        //创建在水平方向分割的分割面板
        hsplitPane = new JSplitPane();

        //创建在垂直方向分割的分割面板
        vsplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);

        //创建按钮
        leftButton = new JButton("左边");

        //创建标签
         topLabel = new JLabel("上面");
        bottomLabel = new JLabel("下面");

        //在水平分割面板的左边放置按钮
        hsplitPane.setLeftComponent(leftButton);

        //在水平分割面板的右边放置垂直分割面板
        hsplitPane.setRightComponent(vsplitPane);

        //设置水平分割面板的分割条距上边为40像素
        hsplitPane.setDividerLocation(40);

        //在垂直分割面板上放置标签
        vsplitPane.setTopComponent(topLabel);
        vsplitPane.setBottomComponent(bottomLabel);

        //设置垂直分割面板的分割条距上边为40像素
        vsplitPane.setDividerLocation(40);

        //将水平分割面板添加到容器中
        add(hsplitPane);

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new JSplitPaneFrame("JSplitPane");
    }
}

运行该实例,结果如下:
在这里插入图片描述

🐶 选项卡面板:JTabbedPane

选项卡面板可以在窗体中放置多个标签页,每个标签页相当于一个与此选项卡大小相同的容器,在每个标签页中都可以放置一个或多个组件,使每个标签页实现不同页面的效果,使用 javax.swing.JTabbedPane 类可创建一个选项卡面板。

① 创建选项卡面板
使用选项卡面板的好处是,用户通过单击具有给定标题或图片的选项卡在一组组件之间进行切换。创建选项卡面板,首先需要创建 JTabbedPane 对象。

JTabbedPane 类的构造方法如下表所示:

构造方法功能
JTabbedPane()创建一个在上面显示标签,布局方式为自动换行的空选项卡
JTabbedPane(int tabPlace)创建一个在指定位置显示标签,布局方式为自动换行的空选项卡
JTabbedPane(int tabPlace, int tabLayout)创建一个在指定位置显示标签和具有指定布局策略的空选项卡

在构造方法中,参数 tabPlace 是用于指定选项卡标签显示位置的字段,参数 tabLayout 是指定选项卡面板标签布局的字段。

tabPlace 参数的常用字段说明如下表所示:

字段描述
JTabbedPane.TOP表示在选项卡的上边位置显示标签
JTabbedPane.BOTTOM表示在选项卡的下边位置显示标签
JTabbedPane.LEFT表示在选项卡的左侧位置显示标签
JTabbedPane.RIGHT表示在选项卡的右侧位置显示标签
JTabbedPane.WRAP_TAB_LAYOUT当选项卡的一行或一列不能显示所有标签时,标签会自动换行或换列

创建窗体,并在该类中创建选项卡面板,示例代码如下:

// 创建一个在上面显示标签,布局方式为自动换行的空选项卡
JTabbedPane tabbedPane1 = new JTabbedPane();

// 创建一个在左侧显示标签,布局方式为自动换行的空选项卡
JTabbedPane tabbedPane2 = new JTabbedPane(JTabbedPane.LEFT);

② 使用选项卡面板
在使用选项卡面板时,可以向面板中添加标题、图标等,使选项卡面板看上去更加漂亮。JTabbedPane 提供了一些方法来实现选项卡面板的常用操作。

JTabbedPane 类的常用方法如下表所示:

方法描述
addTab(String title, Component comp)添加一个标题为 title 且没有图标的选项卡
addTab(String title, Icon icon, Component comp)添加一个标题为 title,图标为 icon 的选项卡
addTab(String title, Icon icon, Component comp, String tip)添加由标题为 title,图标为 icon,工具提示文本为 tip 组成的选项卡
getSelectedComponent()返回选项卡面板当前选中的选项卡
getSelectedIndex()返回当前选中的选项卡的索引

下面让我们来看一个使用 JTabbedPane 的实例。
要求:创建窗体,然后在窗体中添加选项卡面板,在第一个选项卡面板中添加一个按钮,在第二个选项卡面板中添加复选框,在第三个选项卡面板中添加文本域,在第四个选项卡面板中添加单选按钮,此外需要准备 4 个图标。

import javax.swing.*;

public class JTabbedPaneFrame extends JFrame {
    JTabbedPane tabbedPane;
    JButton button;
    Icon icon1, icon2, icon3, icon4;
    JCheckBox checkBox;
    JTextArea textArea;

    public JTabbedPaneFrame(String title) {
        super(title);

        //创建一个在上面显示标签,布局方式为自动换行的空选项卡
        tabbedPane = new JTabbedPane();

        //创建按钮
        button = new JButton("我是一个按钮");

        //实例化图标对象
        icon1 = new ImageIcon("C:\\Users\\15269\\Desktop\\1.ico");
        icon2 = new ImageIcon("C:\\Users\\15269\\Desktop\\1.ico");
        icon3 = new ImageIcon("C:\\Users\\15269\\Desktop\\1.ico");
        icon4 = new ImageIcon("C:\\Users\\15269\\Desktop\\1.ico");

        //添加选项卡
        tabbedPane.addTab("选项卡一", icon1, button, "这里使用了按钮");

        checkBox = new JCheckBox("复选框");
        tabbedPane.addTab("选项卡二", null, checkBox, null);
        tabbedPane.setIconAt(1, icon2);      //为第二个选项卡添加标签图标

        textArea = new JTextArea("文本域");
        tabbedPane.addTab("选项卡三", icon3, textArea, null);
        tabbedPane.setToolTipTextAt(2, "这里使用了文本域");     //为第三个选项卡添加工具提示文本

        JRadioButton radioButton = new JRadioButton("单选按钮");
        tabbedPane.addTab("选项卡四", icon4, radioButton, null);
        
        add(tabbedPane);

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new JTabbedPaneFrame("JTabbedPane");
    }
}

运行该实例,结果如下:
在这里插入图片描述

🐱 布局方式

Swing 中的每个组件在容器中都有一个具体的位置和大小,在容器中摆放各种组件时很难判断其具体的位置和大小。

布局管理器提供了 Swing 组件摆放在容器中的方法,实现了基本的布局功能。和程序员直接在容器中控制 Swing 组件的位置和大小相比,使用布局管理器要方便得多,同时能够有效地处理整个窗体的布局。

Swing 提供的常用布局管理器包括流布局管理器、边界布局管理器和网格布局管理器等。

🐶 随心所欲绝对布局:setLayout(null)

Swing 中,除了使用布局管理器之外,也可以使用绝对布局。绝对布局,顾名思义,就是硬性指定组件在容器中的位置和大小,可以采用绝对坐标的方式来指定组件的位置。

使用绝对布局只需要两步:
使用 Container.setLayout(null) 方法取消布局管理器,如果你的窗体继承了 JFrame 类,那么这一步写 setLayout(null) 就行。
使用 Component.setBounds() 方法设置每个组件的大小与位置。

下面我们来看一个实例。
要求:在项目中创建继承 JFrame 窗体组件的 AbsolutePosition 类,然后设置布局管理器为 null,即绝对定位的布局方式,并创建两个按钮组件,接着将按钮分别定位在不同的窗体位置上。

import javax.swing.*;

public class AbsolutePosition extends JFrame {
    JButton button1, button2;

    public AbsolutePosition(String title) {
        super(title);

        //设置为绝对布局
        setLayout(null);

		//实例化按钮
        button1 = new JButton("按钮1");
        button1.setBounds(30,40,90,30);

        button2 = new JButton("按钮2");
        button2.setBounds(120,160,110,30);

        //把按钮添加到容器中
        add(button1);
        add(button2);

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new AbsolutePosition("AbsolutePosition");
    }
}

运行本实例,结果如下:
在这里插入图片描述

在本实例中,窗体的大小、位置及窗体内组件的大小与位置都被进行了绝对布局的操作。绝对布局使用 setBounds(int x, int y, int width, int height) 方法进行设置。

如果是窗体对象调用 setBounds() 方法,则它的参数 xy 代表这个窗体在整个屏幕(也就是你的电脑屏幕)上出现的位置,widthheight 代表这个窗体的宽与长。

如果是窗体内的组件调用 setBounds() 方法,则它的参数 xy 代表这个组件在整个窗体中摆放的位置,widthheight 代表这个组件的大小。

值得注意的是,在使用绝对布局之前,需要调用 setLayout(null) 方法告知编译器这里不再使用布局管理器。

🐶 默认的边界布局:BorderLayout

布局管理器将组件布局排列在东、西、南、北、中 5 个区域,每个区域可以放置一个组件,也可以放置包含其他组件的容器。

该布局管理器的布局结构如下图所示:
在这里插入图片描述

下面我们来看一个在容器中设置边界布局管理器的实例,在本实例中分别在容器的东、南、西、北、中区域添加 5 个按钮。

要求:在项目中创建 BorderLayoutPosition 类,该类继承 JFrame 类成为窗体组件,然后设置该窗体的布局管理器使用 BorderLayout 类的实例对象。

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

public class BorderLayoutPosition extends JFrame {
    //定义一个组件摆放位置的数组
    String[] border;

    //定义一个按钮名称的数组
    String[] buttonName;

    public BorderLayoutPosition(String title) {
        super(title);

        //设置为边界布局器
        setLayout(new BorderLayout());

        border = new String[]{BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST, BorderLayout.CENTER};
        
        buttonName = new String[]{"north button", "south button", "west button", "east button", "center button"};

        for (int i = 0; i < border.length; i++) {
            //在容器中添加按钮,并设置按钮布局
            add(border[i], new JButton(buttonName[i]));
        }

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new BorderLayoutPosition("BorderLayoutPosition");
    }
}

运行本实例,结果如下:
在这里插入图片描述

本实例将布局及组件名称分别放置在数组中,然后设置容器使用边界布局管理器,最后通过循环将按钮添加至容器中,并设置组件布局。add() 方法提供在容器中添加组件的功能,并同时设置组件的摆放位置。

🐶 奇妙的网格布局:GridLayout

网格布局管理器可以将组件以网格的形式排列。使用网格布局,容器将被分成大小相等的矩形,每个矩形区域中可以放置一个组件,这样放置的组件就像表格中的单元格一样整齐地排列。用户可以设置网格布局管理器的行数和列数,创建不同大小的网格布局管理器。

网格管理器的布局结构如下图所示:
在这里插入图片描述

① 创建网格布局管理器
GridLayout 类表示网格布局管理器,容器通过 setLayout() 方法将容器设置为网格布局的形式。

GridLayout 类的常用构造方法说明如下图所示:

构造方法描述
GridLayout()创建默认的网格布局管理器,这个默认的管理器对象将组件排列在一行或一列中
GridLayout(int rows, int cols)创建具有指定行数和列数的网格布局管理器,布局管理器将为所有组件分配相同大小的空间
GridLayout(int rows, int cols, int hgap, int vgap)创建具有指定行数、列数和组件间距的网格布局管理器,布局管理器将为所有组件分配相同大小的空间

② 使用网格布局管理器
创建网格布局管理器后,用户还可以调用 GridLayout 类的方法改变网格的行数和列数等属性。

GridLayout 类的常用方法如下表所示:

方法描述
setRows(int rows)设置布局管理器中的行数
setColumns(int cols)设置布局管理器中的列数
setHgap(int hgap)将组件之间的水平间距设置为指定值
setVgap(int vgap)将组件之间的垂直间距设置为指定值

下面我们来看一个实例。
要求:在项目中创建 GridLayoutPosition 类,该类继承 JFrame 类成为窗体组件,然后设置该窗体使用 GridLayout 布局管理器。

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

public class GridLayoutPosition extends JFrame {


    public GridLayoutPosition(String title) {
        super(title);

        //设置容器使用网格布局管理器,设置7行3列的网格
        setLayout(new GridLayout(7, 3, 5, 5));

        //循环添加按钮
        for (int i = 0; i < 21; i++) {
            add(new JButton("button" + i));
        }

        //设置窗口风格
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 360, 300);
        setVisible(true);
    }

    //main方法
    public static void main(String args[]) {
        new GridLayoutPosition("GridLayout");
    }
}

运行本实例,结果如下:
在这里插入图片描述

从本实例的运行结果中可以看到,窗体中的布局呈现出一个 73 列的网格,添加到该布局中的组件被放置在网格中。如果尝试去改变窗体的大小,那么我们就会发现其中的组件大小也会相应地改变。

🐶 像水一样的流式布局:FlowLayout

流式布局管理器是最基本的布局管理器。使用流式布局的容器像 “流” 一样按指定的方向排放控件,直到占据了这一行的所有空间,然后再向下移动一行。FlowLayout 类表示流式布局。

FlowLayout 类常用的构造方法说明如下表所示:

构造方法描述
FlowLayout()构造一个新的 FlowLayout 对象,居中对齐,默认的水平和垂直间距是 5 个单位
FlowLayout(int align)创建具有指定对齐方式的 FlowLayout 对象
FlowLayout(int align, int hgap, int vgap)创建具有指定对齐方式及指定的水平和垂直间隙的 FlowLayout 对象

在构造方法中,参数 align 表示组件排放的对齐方式,该参数的可选值如下:
FlowLayout.LEFT:在单行中左对齐。
FlowLayout.CENTER:在单行中居中对齐。
FlowLayout.RIGHT:在单行中右对齐。

下面我们通过一个例子来更好地理解 FlowLayout 在项目中创建 MyFrame 类,该类继承 JFrame 类成为窗体组件,然后设置该窗体使用 FlowLayout 布局管理器进行组件布局。

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

public class MyFrame extends JFrame {

    public MyFrame(String title) {
        super(title);

        //设置为流式布局
        setLayout(new FlowLayout());

        //在容器中添加10个按钮
        for(int i=0;i<10;i++){
            add(new JButton("按钮" + (i+1)));
        }

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400, 300, 260, 200);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new MyFrame("FlowLayout");
    }
}

本实例的运行结果如下图所示:

由于流式布局控件的排放位置与窗体的宽度有关,调整窗体后的运行结果如下图所示:

🐱 事件监听器

在窗体中只添加组件是没有任何意义的,因此需要为组件绑定事件。在应用软件中,事件处理随处可见,如当用户单击关闭按钮时,就会触发关闭窗体的事件处理。

🐶 事件监听器概述

GUI 事件处理机制是指在 GUI 控件中添加的各种操作,如移动鼠标、单击按钮等。事件处理机制就是指 GUI 窗体与用户的交互。

在事件处理机制中,需要理解下面三个重要的概念。
(1) 事件:将用户对控件的一个操作称为一个事件,如单击按钮、关闭窗体等。
(2) 事件源:发生事件的控件就是事件源,如当用户单击按钮时,这个按钮就是事件源。
(3) 事件处理器:负责处理事件的方法,Java 程序对事件处理的方法放在一个类对象中,这个类对象就是事件监听器。

事件监听器首先与控件建立关联,当控件受到外界作用时,就会产生一个相应的事件对象,并把此对象传给与之关联的事件处理器,事件处理器就会被启动并运行相关的代码来处理该事件。

Java 语句中的事件也是对象,一类事件对应一个 AWT 事件类,通过查阅 JDK 文档中的 java.awt.event 包,可了解所有的事件类。

🐶 动作事件监听器:ActionListener

动作事件是经常使用的处理事件,如单击按钮、选择菜单选项等都会发生动作事件。Java 中的动作事件由 ActionEvent 类表示,与动作事件对应的事件处理接口为 ActionListener 接口。

当控件发生动作事件后,ActionListener 接口中的方法会被自动调用,该接口中只有一个方法 actionPerformed()

下面我们以给按钮添加动作事件为例,介绍为控件添加动作事件的步骤。
首先,我们定义一个实现事件监听器的类,创建 ActionDemo 类,该类实现 ActionListener 接口,代码如下。

public class ActionDemo implements ActionListener {

    public void actionPerformed(ActionEvent e) {
        // 此处添加处理事件的代码
    }
}

然后,向事件源注册监听者对象,控件可通过 addActionListener() 方法注册事件监听器,向按钮注册动作事件监听器的代码如下。

button.addActionListener(ad);

上段代码中的 ad 为动作事件监听器接口对象,将动作事件监听对象注册给按钮后,有关事件处理的工作就完成了。此时,当用户单击按钮时,就会有相应的结果出现。

下面我们通过一个完整的实例来进一步了解动作事件监听器的使用。
在窗体中添加关闭按钮,并为该按钮绑定单击事件,实现当用户单击该按钮时,将窗体关闭的功能。

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

public class ActionEventDemo extends JFrame {
    JPanel panel;
    JButton button;

    public static void main(String[] args) {
        new ActionEventDemo("ActionEvent");
    }

    public ActionEventDemo(String title){
        super(title);

        //定义面板对象
        panel = new JPanel();
        setContentPane(panel);

        //定义按钮对象
        button = new JButton("点我关闭窗口");

        //绑定按钮的单击事件
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        panel.add(button);

        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        setBounds(400,300,360,260);
        setVisible(true);       //设置窗口可见
    }
}

本实例的事件监听是通过直接创建 ActionListener 实例实现的,运行结果如下图所示。
在这里插入图片描述

🐶 焦点事件监听器:FocusListener

在实际项目开发中焦点事件监听器的应用也比较广泛,如使光标焦点离开一个文本框时弹出一个对话框,或者将焦点返回给该文本框等,此时就需要为组件添加焦点事件监听器,这个监听器需要实现 FocusListener 接口。该接口定义了两个方法,分别为 focusLost()focusGained() 方法,其中,focusLost() 方法是在组件失去焦点时调用,focusGained() 方法是在组件获取焦点时调用。

下面我们来看一个实例,在窗体中添加文本框与按钮组件,然后为文本框组件绑定焦点事件,当文本框获得焦点时,组件颜色变为青蓝色,当文本框失去焦点时,组件颜色变为绿色。

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

public class FocusEventDemo extends JFrame {
    JPanel panel;
    JTextField t1,t2;

    public static void main(String[] args) {
        new FocusEventDemo("FocusEvent");
    }

    public FocusEventDemo(String title){
        super(title);

        //定义面板对象
        panel = new JPanel();
        setContentPane(panel);

        t1 = new JTextField(15);
        t2 = new JTextField(15);

        t1.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent e) {
                //设置组件背景色为CYAN
                t1.setBackground(Color.CYAN);
            }

            @Override
            public void focusLost(FocusEvent e) {
                t1.setBackground(Color.GREEN);
            }
        });

        panel.add(t1);
        panel.add(t2);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(400,300,260,260);
        setVisible(true);       //设置窗口可见
    }
}

得到焦点时


失去焦点时

在这里插入图片描述

🧸这次的分享就到这里啦,继续加油哦^^
🍭有出错的地方欢迎在评论区指出来,共同进步,谢谢啦

  • 25
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序喵正在路上

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值