Java——GUI编程

一、是什么事GUI编程

1.1、什么是 GUI 编程?

GUI,全称 Graphical User Interface,是指图形用户界面
通过图形元素(如窗口、按钮、文本框等)与用户进行交互。
与命令行界面( CLI)相比,GUI 更加直观、友好。

2、为什么学习 GUI编程?
增强用户体验
广泛应用于桌面应用程序开发
Java 提供了强大的 GUI编程支持

二、Java 的 GUI 编程包

2.1、AWT(Abstract Window Toolkit )

提供了一组原生的 GUI组件,依赖于操作系统的本地窗口系统

2.2、Swing

基于 AWT,提供了更丰富的GU组件,轻量级组件,不依赖于本地窗口系统

2.2.1、常用的 swing 组件

JFrame:窗口
JPanel:用于组织其他组件的容器
JButton:按钮组件
JTextField:输入框
JTable:表格
...

2.2.2、快速入门一下GUI Swing的编程

import javax.swing.*;

public class login{
    public static void main(String[] args) {
        // 1、创建一个窗口,有一个登录按钮。
        JFrame jf = new JFrame("登录窗口");

        JPanel panel = new JPanel(); // 创建一个面板
        jf.add(panel); // 将面板添加到窗口中

        jf.setSize(400, 300); // 设置窗口大小
        jf.setLocationRelativeTo(null); // 设置窗口居中
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口的默认操作: 关闭窗口退出程序

        JButton jb = new JButton("登录"); // 创建一个按钮
        panel.add(jb); // 将按钮添加到面板中

        jf.setVisible(true); // 显示窗口
    }
}

三、常见的布局管理器

布局管理器(Layout Manager)它们可以决定组件在容器中的布局方式,避免了手动设置每个组件的位置和大小,从而简化了 GU设计过程。

3.1、FlowLayout

3.1.1、简介:

FlowLayout 是最简单的布局管理器,它按水平方向从左到右排列组件,当一行排满时,自动换到下一行。

3.1.2、特点:

默认居中对齐,可以设置为左对齐或右对齐。
适用于需要简单排列的场景。

3.1.3、示例

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

public class FlowLayoutExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("FlowLayout布局管理器");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLayout(new FlowLayout()); // 设置布局管理器

        frame.add(new JButton("Button 1"));
        frame.add(new JButton("Button 2"));
        frame.add(new JButton("Button 3"));
        frame.add(new JButton("Button 4"));
        frame.add(new JButton("Button 5"));

        frame.setVisible(true);
    }
}

3.2、BorderLayout

3.1.1、简介:

BorderLayout 将容器划分为五个区域:东、南、西、北和中(East, South, West, North, Center)。每个区域只能添加一个组件,未添加组件的区域保持空白。

3.1.2、特点:

适用于需要在特定区域布局组件的场景。
中间区域会占据所有剩余的空间。

3.1.3、示例

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

public class BorderLayoutExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("BorderLayout Example");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLayout(new BorderLayout());

        frame.add(new JButton("North"), BorderLayout.NORTH);
        frame.add(new JButton("South"), BorderLayout.SOUTH);
        frame.add(new JButton("East"), BorderLayout.EAST);
        frame.add(new JButton("West"), BorderLayout.WEST);
        frame.add(new JButton("Center"), BorderLayout.CENTER);

        frame.setVisible(true);
    }
}

3.3、GridLayout

3.1.1、简介:

GridLayout 将容器划分为等大小的网格,每个网格中可以添加一个组件,所有组件大小相同。

3.1.2、特点:

适用于需要均匀排列组件的场景。
行和列的数量可以指定。

3.1.3、示例

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

public class GridLayoutExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("GridLayout Example");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setLayout(new GridLayout(2, 3)); // 2行3列的网格

        frame.add(new JButton("Button 1"));
        frame.add(new JButton("Button 2"));
        frame.add(new JButton("Button 3"));
        frame.add(new JButton("Button 4"));
        frame.add(new JButton("Button 5"));
        frame.add(new JButton("Button 6"));

        frame.setVisible(true);
    }
}

3.4、BoxLayout

3.1.1、简介:

BoxLayout 能够沿着单一轴线(X轴或Y轴)排列组件。可以创建水平(X轴)或垂直(Y轴)排列的布局。

3.1.2、特点:

适用于需要沿单一方向排列组件的场景。
可以通过添加垂直或水平间隔(Glue、Strut)来调整组件间距。

3.1.3、示例

import javax.swing.*;

public class BoxLayoutExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("BoxLayout Example");
        frame.setSize(400, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); // 垂直排列

        panel.add(new JButton("Button 1"));
        panel.add(Box.createVerticalStrut(10)); // 添加垂直间隔
        panel.add(new JButton("Button 2"));
        panel.add(Box.createVerticalStrut(10));
        panel.add(new JButton("Button 3"));
        panel.add(Box.createVerticalStrut(10));
        panel.add(new JButton("Button 4"));

        frame.add(panel);
        frame.setVisible(true);
    }
}

3.5、...

四、通过 AI 帮助生成想要的 GUI 界面

eg:我是一名 Java 开发人员,帮我用 Swing 开发一个登录界面,要求登录界面看起来比较好看比较美观,你可以用一些样式让界面好看些

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

public class LoginUI {
    public static void main(String[] args) {
            JFrame frame = new JFrame("公司项目登录界面"); // 创建窗口
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口时退出程序
            frame.setSize(400, 300); // 设置窗口大小
            frame.setLocationRelativeTo(null); // 居中显示

            // 设置背景颜色
            frame.getContentPane().setBackground(new Color(245, 245, 245)); // 灰白色背景

            // 创建面板
            JPanel panel = new JPanel(); // 创建面板
            panel.setLayout(new GridBagLayout()); // 使用网格布局
            GridBagConstraints gbc = new GridBagConstraints(); // 设置网格布局的约束
            gbc.insets = new Insets(10, 10, 10, 10); // 内边距
            gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向

            // 标题标签
            JLabel titleLabel = new JLabel("欢迎登录"); // 标题标签
            titleLabel.setFont(new Font("楷体", Font.BOLD, 24)); // 楷体加粗
            titleLabel.setForeground(new Color(64, 64, 64)); // 深灰色文字
            gbc.gridx = 0; // 第一列
            gbc.gridy = 0; // 第一行
            gbc.gridwidth = 2; // 占两列
            gbc.anchor = GridBagConstraints.CENTER; // 左对齐
            panel.add(titleLabel, gbc); // 添加标题标签

            // 用户名输入框
            gbc.gridy++; // 第二行
            gbc.gridwidth = 1; // 占一列
            gbc.anchor = GridBagConstraints.LINE_START; // 左对齐
            panel.add(new JLabel("用户名:"), gbc); // 添加用户名标签
            gbc.gridx++; // 第二列
            gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
            JTextField usernameField = new JTextField(20); // 用户名输入框
            panel.add(usernameField, gbc); // 添加用户名输入框

            // 密码输入框
            gbc.gridy++; // 第三行
            gbc.gridx = 0; // 第一列
            gbc.fill = GridBagConstraints.NONE; // 不填充
            panel.add(new JLabel("密码:"), gbc); // 添加密码标签
            gbc.gridx++; // 第二列
            gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
            JPasswordField passwordField = new JPasswordField(20); // 密码输入框
            panel.add(passwordField, gbc); // 添加密码输入框

            // 登录按钮
            gbc.gridy++; // 第四行
            gbc.gridx = 0; // 第一列
            gbc.gridwidth = 2; // 占两列
            gbc.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
            JButton loginButton = new JButton("登录"); // 登录按钮
            loginButton.setBackground(new Color(0, 128, 255)); // 蓝色按钮
            loginButton.setForeground(Color.WHITE); // 白色文字
            loginButton.setFont(new Font("楷体", Font.BOLD, 14)); // 楷体加粗
            panel.add(loginButton, gbc); // 添加登录按钮

            frame.add(panel); // 将面板添加到窗口中
            frame.setVisible(true); // 显示窗口
    }
}

五、事件处理

GUI 编程中,事件的处理是通过事件监听器( Event Listener )来完成的。

5.1、常用的时间监听器对象

5.1.1、点击事件监听器 ActionListener

对2.2.2的示例添加点击事件监听

import javax.swing.*;

public class login{
    public static void main(String[] args) {
        // 1、创建一个窗口,有一个登录按钮。
        JFrame jf = new JFrame("登录窗口");

        JPanel panel = new JPanel(); // 创建一个面板
        jf.add(panel); // 将面板添加到窗口中

        jf.setSize(400, 300); // 设置窗口大小
        jf.setLocationRelativeTo(null); // 设置窗口居中
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口的默认操作: 关闭窗口退出程序

        JButton jb = new JButton("登录"); // 创建一个按钮
        panel.add(jb); // 将按钮添加到面板中

        // 给按钮绑定“点击事件”监听器对象
//        jb.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(java.awt.event.ActionEvent e) {
//                // 一旦你点击jb按钮,底层触发这个方法执行
//                // e是事件对象,封装了事件相关信息。
//                JOptionPane.showMessageDialog(jf, "有人点击了登录");
//                System.out.println("登录成功!");
//            }
//        });
        jb.addActionListener(e -> {
            JOptionPane.showMessageDialog(jf, "有人点击了登录");
            System.out.println("登录成功!");
        });

        jf.setVisible(true); // 显示窗口
    }
}

5.1.2、按键事件监听器 KeyListener

 需求:监听用户键盘上下左右四个按键的事件

import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class test01 {
    public static void main(String[] args) {

        JFrame jf = new JFrame("键盘监听");
        jf.setSize(400, 300);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        jf.add(panel);

        jf.setVisible(true);

        // jf窗口整体绑定键盘监听器
        jf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                // 获取键盘按键的编号
                int keyCode = e.getKeyCode(); // 获取键盘按键的编号
                // 判断按键编码
                switch (keyCode) {
                    case KeyEvent.VK_UP:
                        System.out.println("用户按下了上");
                        break;
                    case KeyEvent.VK_DOWN:
                        System.out.println("用户按下了下");
                        break;
                    case KeyEvent.VK_LEFT:
                        System.out.println("用户按下了左");
                        break;
                    case KeyEvent.VK_RIGHT:
                        System.out.println("用户按下了右");
                }
            }
        });

    }
}

5.1.3、鼠标行为监听器 MouseListener

...

5.2、事件的几种常见写法

第 1 种:直接提供实现类,用于创建事件监听对象

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

public class test01 {
    public static void main(String[] args) {
        JFrame jf = new JFrame("键盘监听");
        jf.setSize(400, 300);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        jf.add(panel);

        JButton jb = new JButton("登录"); // 创建一个按钮
        panel.add(jb); // 将按钮添加到面板中
        
        jb.addActionListener(new MyActionListener(jf));

        jf.setVisible(true);
    }

    private static class MyActionListener implements ActionListener {
        private JFrame jf;
        public MyActionListener(JFrame jf) {
            this.jf = jf;
        }
        @Override
        public void actionPerformed(java.awt.event.ActionEvent e) {
            JOptionPane.showMessageDialog(jf, "有人点击了登录");
            System.out.println("登录成功!");
        }
    }
}

第 2 种:直接使用匿名内部类的对象,代表事件监听对象

详见-->5.1.2示例

第3种:自定义窗口,让窗口对象实现事件接口(重要)

public class test03 {
    public static void main(String[] args) {
        // 创建登录界面
        LoginFrame lf = new LoginFrame(); // 自定义窗口

        lf.setVisible(true);// 显示窗口

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

public class LoginFrame extends JFrame implements ActionListener {
    public LoginFrame() { // 创建登录界面
        setTitle("登录界面");
        setSize(400, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        init();
    }
    private void init() { // 初始化界面
        JButton btn = new JButton("登录");
         JPanel panel = new JPanel();
         panel.add(btn);

         add(panel);

         btn.addActionListener(this);// 给按钮添加点击监听器
    }

    @Override
    public void actionPerformed(ActionEvent e) {// 让窗口对象实现事件接口
        JOptionPane.showMessageDialog(this, "有人点击了登录");
        System.out.println("登录成功!");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值