【Java】Swing

在这里插入图片描述

常用组件

在这里插入图片描述
在这里插入图片描述

窗体 JFrame

现在我们看一下Java中如何使用窗体

首先要导入javax.swing

import javax.swing.*;
public class Demo  {
    
    
    
    public static void main(String[] args) {
    
    


        JFrame jFrame = new JFrame("窗体标题");//创建窗体对象
        jFrame.setVisible(true);//设置窗体可见
        /**
         * 窗体关闭规则
         * EXIT_ON_CLOSE : 隐藏窗口,并停止程序
         * DO_NOTHING_ON_CLOSE : 无任何操作
         * HIDE_ON_CLOSE : 隐藏窗体,但不停止程序
         * DISPOSE_ON_CLOSE : 释放窗体资源
         */
        jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗体时关闭程序

        //设置窗体大小,(单位:像素)
        //jFrame.setSize(300, 200);

        //设置坐标,(单位:像素)
        //jFrame.setLocation(200, 200);

        //设置窗体坐标,大小(单位:像素)
        jFrame.setBounds(200, 200, 300, 200);

        jFrame.setResizable(false);//设置窗体大小不可以改变

        //获取窗体容器
        Container c = jFrame.getContentPane();

        c.setBackground(Color.BLUE);//设置背景颜色
        JLabel jLabel = new JLabel("这是一个窗体");//创建一个标签

        c.add(jLabel);//添加组件

        c.remove(jLabel);//删除组件

        c.validate();//验证容器中的组件(刷新)

        jFrame.setContentPane(c);//重新载入容器
    }
}

实际开发中,我们通常会将该类继承自JFrame,然后直接在构造器中添加窗体配置,这样在创建新对象时,直接进行初始化即可。

public class Demo extends JFrame  {

	//在构造器中直接进行窗体的初始化配置
    public Demo(){

        setVisible(true); //设置窗体可见

        setTitle("窗体标题"); //设置窗体标题
        /**
         * 窗体关闭规则
         * EXIT_ON_CLOSE : 隐藏窗口,并停止程序
         * DO_NOTHING_ON_CLOSE : 无任何操作
         * HIDE_ON_CLOSE : 隐藏窗体,但不停止程序
         * DISPOSE_ON_CLOSE : 释放窗体资源
         */
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//关闭窗体时关闭程序

        //设置窗体大小,(单位:像素)
        //jFrame.setSize(300, 200);

        //设置坐标,(单位:像素)
        //jFrame.setLocation(200, 200);

        //设置窗体坐标,大小(单位:像素)
        setBounds(200, 200, 300, 200);

        setResizable(false);//设置窗体大小不可以改变

        //获取窗体容器
        Container c = getContentPane();

        c.setBackground(Color.BLUE);//设置背景颜色
        JLabel jLabel = new JLabel("这是一个窗体");//创建一个标签

        c.add(jLabel);//添加组件

        //c.remove(jLabel);//删除组件

        c.validate();//验证容器中的组件(刷新)

        setContentPane(c);//重新载入容器
    }

    public static void main(String[] args) {
        new Demo();
    }
}

JDialog

对话框窗体

public class JDialogDemo extends JDialog {
    
    

    public JDialogDemo(JFrame jFrame){
    
    
        /**
         * 第一个参数是父窗体对象
         * 第二个参数:对话框标题
         * 第三个参数:是否阻塞父窗体
         */
        super(jFrame, "对话框标题", true);

        Container c = getContentPane();//获取窗体容器
        c.add(new JLabel("这是一个对话框"));

        setVisible(true);//设置窗体可见
        setBounds(100, 100, 100, 100);//设置窗体坐标和大小

    }

    public static void main(String[] args) {
    
    
        JFrame f = new JFrame("父窗体");
        f.setBounds(50, 50, 300, 300);

        Container c = f.getContentPane();
        JButton button = new JButton("弹出对话框");
        c.setLayout(new FlowLayout());//设置布局,使用流布局
        c.add(button);
        f.setVisible(true);
        f.setDefaultCloseOperation(EXIT_ON_CLOSE);

        //设置按钮监听事件
        button.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                JDialogDemo jd = new JDialogDemo(f);
                jd.setVisible(true);
            }
        });
    }
}

标签的使用

  • 创建一个新标签JLabel jl = new JLabel("这是一个标签");

  • 设置标签内容jl.setText("更改标签内容");

  • 获取标签内容jl.getText("更改标签内容");

  • 设置字体属性(字体类型,格式,大小) jl.setFont(new Font("微软雅黑", Font.BOLD, 24));

  • 设置字体颜色jl.setForeground(Color.RED);

  • 设置标签大小jl.setSize(200, 200)

public class JLabelDemo extends JFrame {
    
    
    public JLabelDemo(){
    
    
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);

        JLabel jl = new JLabel("这是一个标签");
        jl.setText("更改标签内容");
        //设置字体属性(字体类型,格式,大小)
        jl.setFont(new Font("微软雅黑", Font.BOLD, 24));
        
        //设置字体颜色
        jl.setForeground(Color.RED);
        
        //获取标签内容
        System.out.println(jl.getText());
        
        c.add(jl);
    }

    public static void main(String[] args) {
    
    
        new JLabelDemo();
    }
}

图标的使用

添加图片也是使用标签,有两种方式

第一种:

public class PicDemo extends JFrame {
    
    
    public PicDemo() {
    
    
        setBounds(200, 200, 600, 500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);

        JLabel jl = new JLabel("这是一个展示图片的标签");

        //获取图片rul路径
        URL url = PicDemo.class.getResource("beauty.jpg");
        //设置图标
        Icon icon = new ImageIcon(url);
        //将图标添加到标签中
        jl.setIcon(icon);
        
        c.add(jl);
    }

    public static void main(String[] args) {
    
    
        new PicDemo();
    }
}

在这里插入图片描述

第二种:

public class PicDemo extends JFrame {
    
    
    public PicDemo() {
    
    
        setBounds(200, 200, 600, 500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);

        JLabel jl = new JLabel("这是一个展示图片的标签");

        //设置图标
        Icon icon = new ImageIcon("src/beauty.jpg");
        //将图标添加到标签中
        jl.setIcon(icon);

        c.add(jl);
    }

    public static void main(String[] args) {
    
    
        new PicDemo();
    }
}

效果同上。

即使设置标签大小,也不会改变图片大小。

布局

绝对布局

也叫null布局,使用坐标来控制组件位置

在这里插入图片描述

public class NullLayoutDemo extends JFrame {
    
    
    public NullLayoutDemo(){
    
    
        setBounds(200, 200, 500, 600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();

        //将容器布局设为绝对布局
        c.setLayout(null);

        JButton b1 = new JButton("按钮一"),
                b2 = new JButton("按钮二");
        //设置按钮的位置和大小(位置相对于容器)
        b1.setBounds(50, 100, 200, 100);
        b2.setBounds(50, 300, 200, 100);
         c.add(b1);
         c.add(b2);
        setVisible(true);

    }

    public static void main(String[] args) {
    
    
        new NullLayoutDemo();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JOoZgdW0-1596465300481)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803181043974.png)]

流布局管理器

在这里插入图片描述

  • 将容器布局设为流布局:c.setLayout(new FlowLayout());

  • 左对齐:c.setLayout(new FlowLayout(FlowLayout.LEFT));

  • 右对齐:c.setLayout(new FlowLayout(FlowLayout.RIGHT));

  • 水平间距,垂直间距:c.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 20));

案例:

public class FlowLayoutDemo extends JFrame {
    
    
    public FlowLayoutDemo(){
    
    
        setBounds(200, 200, 500, 600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();

        //将容器布局设为流布局
        c.setLayout(new FlowLayout());

        for (int i = 0; i<20; i++){
    
    
            c.add(new JButton("按钮" + i));
        }
        setVisible(true);

    }

    public static void main(String[] args) {
    
    
        new FlowLayoutDemo();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK1cEWS1-1596465300483)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803181354629.png)]

边界布局管理器

窗体的默认布局

在这里插入图片描述

public class BorderLayoutDemo extends JFrame {
    
    
    public BorderLayoutDemo(){
    
    
        setBounds(200, 200, 500, 600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();

        //将容器布局设为流布局
        c.setLayout(new BorderLayout());

        JButton b1 = new JButton("中"),
                b2 = new JButton("东"),
                b3 = new JButton("南"),
                b4 = new JButton("西"),
                b5 = new JButton("北");
        c.add(b1, BorderLayout.CENTER);
        c.add(b2, BorderLayout.EAST);
        c.add(b3, BorderLayout.SOUTH);
        c.add(b4, BorderLayout.WEST);
        c.add(b5, BorderLayout.NORTH);

        setVisible(true);
    }

    public static void main(String[] args) {
    
    
        new BorderLayoutDemo();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YwG2g45Q-1596465300485)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803182441461.png)]

覆盖:如果在同一位置添加新元素,新组建会覆盖旧组件。

网格布局管理器

在这里插入图片描述

public class GridLayoutDemo extends JFrame {
    
    
    public GridLayoutDemo(){
    
    
        setBounds(200, 200, 500, 600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();

        //将容器布局设为网格布局
        //7 行 3 列,水平间距,垂直间距均为5
        c.setLayout(new GridLayout(7, 3, 5, 5));

        for (int i = 0; i<=20; i++){
    
    
            c.add(new JButton("按钮" + i));
        }
        setVisible(true);

    }

    public static void main(String[] args) {
    
    
        new GridLayoutDemo();
    }
}

效果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-45Q2Qg5l-1596465300486)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803183007875.png)]

会根据窗体的大小动态改变按钮的大小。始终保持窗体的排列顺序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f5IRX4kV-1596465300487)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803183233234.png)]

如果手动分配的行列数不可以满足组件数,系统自动优化布局,将行列扩大,从而达到所有组件都可以显示。

网格组布局管理器

在这里插入图片描述
在这里插入图片描述

gridx和gridy属性

在这里插入图片描述

框组件

下拉列表框组件

有三种下拉列表框中添加数据的方法

方法一
       JComboBox<String> jcb = new JComboBox<>();
       jcb.addItem("身份证");
       jcb.addItem("学生证");
       jcb.addItem("工作证");



方法二
        String items[] = {
    
    "数组元素1", "数组元素2", "数组元素3"};
        JComboBox<String> jcb = new JComboBox<>(items);



方法三
        JComboBox<String> jcb = new JComboBox<>();
        String items[] = {
    
    "数组元素1", "数组元素2", "数组元素3"};
        ComboBoxModel cm = new DefaultComboBoxModel(items);//创建下拉列表模型,保存下拉列表中的数据
        jcb.setModel(cm);//向列表中添加数据模型

复选框是否可以被编辑:jcb.setEditable(true/false)

案例:

public class JComBoxDemo extends JFrame {
    public JComBoxDemo(){
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);
//      方法一
//       JComboBox<String> jcb = new JComboBox<>();
//       jcb.addItem("身份证");
//       jcb.addItem("学生证");
//       jcb.addItem("工作证");

//        方法二
//        String items[] = {"数组元素1", "数组元素2", "数组元素3"};
//        JComboBox<String> jcb = new JComboBox<>(items);

        JComboBox<String> jcb = new JComboBox<>();
        String items[] = {"数组元素1", "数组元素2", "数组元素3"};
        ComboBoxModel cm = new DefaultComboBoxModel(items);//创建下拉列表模型,保存下拉列表中的数据
        jcb.setModel(cm);//向列表中添加数据模型

        JButton btn = new JButton("打印");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("选中的索引" + jcb.getSelectedIndex() );
                System.out.println("选中的值" + jcb.getSelectedItem());
            }
        });
        btn.setBounds(100, 10, 60, 20);
        c.add(btn);

       jcb.setBounds(100, 100, 100, 100);
	   jcb.setEditable(true/false)//复选框是否可以被编辑


        c.add(jcb);
    }

    public static void main(String[] args) {
        new JComBoxDemo();
    }
}

列表框组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8jvnTXfL-1596465300490)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803195402798.png)]

public class JListDemo extends JFrame {
    
    
    public JListDemo() {
    
    
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);

        String items[] = {
    
    "元素1", "元素2", "元素3", "元素4", "元素5"};
        JList<String> jl = new JList(items);
        jl.setBounds(10, 10, 100, 30);
        c.add(jl);

        c.add(jl);
    }

    public static void main(String[] args) {
    
    
        new JListDemo();
    }
}

但是这样可能会出现信息显示不全的可能。

所以我们添加一个滚动面板

public JListDemo() {
    setBounds(200, 200, 300, 200);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    Container c = getContentPane();
    setVisible(true);

    String items[] = {
            "元素1", "元素2", "元素3", "元素4", "元素5",
            "元素1", "元素2", "元素3", "元素4", "元素5",
            "元素1", "元素2", "元素3", "元素4", "元素5",
            "元素1", "元素2", "元素3", "元素4", "元素5"};
    JList<String> jl = new JList(items);

    //为列表框添加滚动条
    JScrollPane js = new JScrollPane(jl);
    js.setBounds(10, 10, 100, 100);
    c.add(js);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-euxHSbrQ-1596465300491)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803205346059.png)]

其它添加数据的方法:

通过数据模型添加元素

public JListDemo() {
    
    
    setBounds(200, 200, 300, 200);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    Container c = getContentPane();
    setVisible(true);

    String items[] = {
    
    
            "元素1", "元素2", "元素3", "元素4", "元素5",
            "元素1", "元素2", "元素3", "元素4", "元素5",
            "元素1", "元素2", "元素3", "元素4", "元素5",
            "元素1", "元素2", "元素3", "元素4", "元素5"};

    DefaultListModel<String> model = new DefaultListModel<>();
    for (String tmp:items){
    
    
        model.addElement(tmp);//向数据模型添加元素
    }
    JList<String> jl = new JList(items);
    jl.setModel(model);//列表框载入数据模型。

    //为列表框添加滚动条
    JScrollPane js = new JScrollPane(jl);
    js.setBounds(10, 10, 100, 100);
    c.add(js);
}

设置选择模式:

/*
 * 1.SINGLE_SELECTION 单选模式
 * 2.SINGLE_INTERVAL_SELECTION 只能连续选择相邻的元素
 * 3.MULTIPLE_INTERVAL_SELECTION 随便选
 */
jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

取出选择的内容:

JButton jbt = new JButton("选择内容");
jbt.setBounds(10,10,60,20);
jbt.addActionListener(new ActionListener() {
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
    
    
        //获取列表框中选中的所有元素
        List<String> values = jl.getSelectedValuesList();

        for(String  tmp: values){
    
    
            System.out.println(tmp);
        }
        System.out.println("--------end--------");
    }
});
c.add(jbt);

完整代码:

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

public class JListDemo extends JFrame {
    
    
    public JListDemo() {
    
    
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        setVisible(true);

        String items[] = {
    
    
                "元素1", "元素2", "元素3", "元素4", "元素5",
                "元素1", "元素2", "元素3", "元素4", "元素5",
                "元素1", "元素2", "元素3", "元素4", "元素5",
                "元素1", "元素2", "元素3", "元素4", "元素5"};

        DefaultListModel<String> model = new DefaultListModel<>();
        for (String tmp:items){
    
    
            model.addElement(tmp);//向数据模型添加元素
        }
        JList<String> jl = new JList(items);
        jl.setModel(model);//列表框载入数据模型。

        /*
         * 1.SINGLE_SELECTION 单选模式
         * 2.SINGLE_INTERVAL_SELECTION 只能连续选择相邻的元素
         * 3.MULTIPLE_INTERVAL_SELECTION 随便选
         */
        jl.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

        //为列表框添加滚动条
        JScrollPane js = new JScrollPane(jl);
        js.setBounds(10, 10, 100, 100);

        JButton jbt = new JButton("选择内容");
        jbt.setBounds(10,10,60,20);
        jbt.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                //获取列表框中选中的所有元素
                List<String> values = jl.getSelectedValuesList();

                for(String  tmp: values){
    
    
                    System.out.println(tmp);
                }
                System.out.println("--------end--------");
            }
        });
        c.add(jbt);

        c.add(js);
    }

    public static void main(String[] args) {
    
    
        new JListDemo();
    }
}

文本框组件

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

public class JTestFieldDemo extends JFrame {
    public JTestFieldDemo() {
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        setVisible(true);

        //设置文本框长度=setColumns(20)
        JTextField jt = new JTextField(20);
        jt.setColumns(20);
        jt.setText("这是一个文本框");
        jt.setFont(new Font("黑体", Font.PLAIN, 20));
        c.add(jt);


        JButton jbt = new JButton("获取内容");
        jbt.setBounds(10, 10, 60, 20);
        jbt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取文本框中的文本值
                System.out.println("文本框中的内容为:" + jt.getText());
                jt.setText("");//清空
                jt.requestFocus();//获取焦点
            }
        });
        c.add(jbt);
    }

    public static void main(String[] args) {
        new JTestFieldDemo();
    }
}

密码框组件

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

public class JPasswordFieldDemo extends JFrame {
    
    
    public JPasswordFieldDemo() {
    
    
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        setVisible(true);

        JPasswordField jp = new JPasswordField();
        jp.setColumns(20);//设置密码框长度
        jp.setFont(new Font("黑体", Font.PLAIN, 20));//设置字体
        //jp.setEchoChar('*');
        jp.setEchoChar('\u2605');//设置回显字符

        //设置密码框的动态监听
        jp.addActionListener(new ActionListener() {
    
    
            @Override
            public void actionPerformed(ActionEvent e) {
    
    
                char ch[] = jp.getPassword();//获取密码的字符数组
                String str = new String(ch);
                System.out.println(str);
            }
        });
        c.add(jp);

    }

    public static void main(String[] args) {
    
    
        new JPasswordFieldDemo();
    }
}

文本域组件

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

public class JTextAreaDemo extends JFrame {
    
    
    public JTextAreaDemo() {
    
    
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        setVisible(true);

        JTextArea jt = new JTextArea();
        jt.setColumns(100);//设置100列
        jt.setRows(200);//设置200行
        //jt.setText("这是一个文本域");//设置文本域内容
        jt.append("这是一个文本域,你可以在后面添加内容");
        jt.insert("插入",10);//在第10个字符后面插入内容
        jt.setFont(new Font("楷体", Font.PLAIN, 28));

        //给文本域添加滚动条
        JScrollPane js = new JScrollPane(jt);

        c.add(js);
    }

    public static void main(String[] args) {
    
    
        new JTextAreaDemo();
    }
}

监听事件

在这里插入图片描述

动作事件监听器

在这里插入图片描述

相当于Android的点击事件,只是实现方法不同

按钮点击事件

JButton jbt  = new JButton();
jbt.setBounds(10,10,40,20);
jbt.addActionListener(new ActionListener() {
    
    
    @Override
    public void actionPerformed(ActionEvent e) {
    
    
        //监听到事件发生后执行的逻辑
    }
});

焦点事件监听器

在这里插入图片描述

jt.addFocusListener(new FocusListener() {
    
    
    @Override
    //获得焦点
    public void focusGained(FocusEvent e) {
    
    
        System.out.println("获得焦点");
    }

    @Override
    //失去焦点
    public void focusLost(FocusEvent e) {
    
    
        System.out.println("失去焦点");
    }
});

简化操作:

定义一个焦点监听实现类实现FocusListener接口。

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

public class JTextAreaDemo extends JFrame {
    
    
    public JTextAreaDemo() {
    
    
        setBounds(200, 200, 300, 200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        setVisible(true);

        JTextArea jt = new JTextArea();
        jt.setColumns(100);//设置100列
        jt.setRows(200);//设置200行
        //jt.setText("这是一个文本域");//设置文本域内容
        jt.append("这是一个文本域,你可以在后面添加内容");
        jt.insert("插入",10);//在第10个字符后面插入内容
        jt.setFont(new Font("楷体", Font.PLAIN, 28));

        //使用自定义鉴定实现类
        jt.addFocusListener(new MyFocusListener());

        c.add(jt);
    }

    public static void main(String[] args) {
    
    
        new JTextAreaDemo();
    }

    //自定义的焦点事件监听实现类
    class MyFocusListener implements FocusListener{
    
    

        @Override
        public void focusGained(FocusEvent e) {
    
    
            Object o = e.getSource();//获取触发世事件的组件
            System.out.println(o.toString());
        }

        @Override
        public void focusLost(FocusEvent e) {
    
    
            Object o = e.getSource();//获取触发世事件的组件
            System.out.println(o.toString());
        }
    }
}
```[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6ANNhEk-1596465300474)(C:\Users\vsue\AppData\Roaming\Typora\typora-user-images\image-20200803155743764.png)]


猜你喜欢

转载自blog.csdn.net/weixin_45468845/article/details/107766022