JavaSE_12_Java GUI

本文介绍了JavaGUI编程的基础知识,包括使用JFrame创建窗体,理解不同布局管理器如边界布局、流式布局和网格布局,以及如何添加组件如JLabel、JTextField。此外,还详细讲解了事件监听的概念和实现,如ActionListener,以及如何处理用户交互。最后,通过实例展示了JPanel的使用,包括自定义图片显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Java GUI》

目录

  • 窗体类(熟练)
  • 组件类(掌握)
  • 事件监听(熟练)
  • 面板类(掌握)

一、窗体类

JFrame为Java GUI中的顶层容器,又称之为窗体类,我们可以继承它并定义自己的窗体类。

界面布局类型

  • 边界布局(了解)
  • 流式布局(了解)
  • 网格布局(了解)
  • 自定义布局(较灵活,较常用)

案例一(注册窗体实现)

package com.hpr.page;

import javax.swing.*;

public class Register extends JFrame {

    public Register() {
        //设置标题
        setTitle("注册界面");
        //设置大小
        setSize(400, 600);
        //设置居中
        setLocationRelativeTo(null);
        //设置可变性
        setResizable(false);
        //设置关闭选项
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //设置布局类型
        setLayout(null);

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

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

执行结果

请添加图片描述

窗体解析(其中title会占掉≈33像素高度)

请添加图片描述

二、组件

常用组件

  • JLabel:标签
  • JTextField:文本框
  • JPasswordField:密码框
  • JButton:按钮
  • JTextArea:文本域
  • JTable jt:表格
  • JScrollPane:滚动条

界面UI设计

请添加图片描述

案例二(UI还原实现)

package com.hpr.page;

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

public class Register extends JFrame {

    JLabel jlb1, jlb2, jlb3, jlb4, jlb5;
    JTextField jtf;
    JPasswordField jpf1, jpf2;
    JTextArea jta;
    JScrollPane jsp;
    JButton jbtn;

    public Register() {
        //相关设置
		...
		
        //1.欢迎注册
        jlb1 = new JLabel("欢迎注册", JLabel.CENTER);
        jlb1.setFont(new Font("楷体", Font.BOLD, 34));
        jlb1.setBounds(0, 0, 400, 80);

        //2.昵称
        jlb2 = new JLabel("昵称", JLabel.RIGHT);
        jlb2.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        jlb2.setBounds(20, 120, 80, 30);

        jtf = new JTextField();
        jtf.setBounds(120, 120, 250, 30);

        //3.密码
        jlb3 = new JLabel("密码", JLabel.RIGHT);
        jlb3.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        jlb3.setBounds(20, 180, 80, 30);

        jpf1 = new JPasswordField();
        jpf1.setBounds(120, 180, 250, 30);

        //4.确认密码
        jlb4 = new JLabel("确认密码", JLabel.RIGHT);
        jlb4.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        jlb4.setBounds(20, 240, 80, 30);

        jpf2 = new JPasswordField();
        jpf2.setBounds(120, 240, 250, 30);

        //5.个人简介
        jlb5 = new JLabel("个人简介", JLabel.RIGHT);
        jlb5.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        jlb5.setBounds(20, 300, 80, 30);

        jta = new JTextArea();
        jsp = new JScrollPane(jta);
        jsp.setBounds(120, 300, 250, 80);

        //6.注册按钮
        jbtn = new JButton("注册");
        jbtn.setBackground(new Color(70, 247, 76));
        jbtn.setBounds(120, 410, 250, 30);

        //窗体添加组件
        this.add(jlb1);
        add(jlb2);
        add(jtf);
        add(jlb3);
        add(jpf1);
        add(jlb4);
        add(jpf2);
        add(jlb5);
        add(jsp);
        add(jbtn);

        //窗体可见性设置放在最后一句
        setVisible(true);
    }

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

执行结果

请添加图片描述

三、事件监听

相关概念

  1. 事件源:事件发起的源头;
  2. 监听器:实现监听接口的类为监听类,该类的对象为监听器;
  3. 事件处理:监听到事件信号后要做的事。

案例三(事件监听)

  • EventTest类
package com.hpr.page;

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

public class EventTest extends JFrame {

    JButton jbtn1, jbtn2, jbtn3;

    public EventTest() {
        setTitle("事件测试");
        setSize(300, 500);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);

        //创建监听器
        CustomListener cl = new CustomListener();

        //1.信息提示框
        jbtn1 = new JButton("登录");
        jbtn1.setBounds(20, 100, 260, 30);
        jbtn1.addActionListener(cl);

        //2.确认提示框
        jbtn2 = new JButton("退出");
        jbtn2.setBounds(20, 200, 260, 30);
        jbtn2.addActionListener(cl);

        //3.文本提示框
        jbtn3 = new JButton("卸载");
        jbtn3.setBounds(20, 300, 260, 30);
        jbtn3.addActionListener(cl);

        add(jbtn1);
        add(jbtn2);
        add(jbtn3);
        setVisible(true);
    }

    /**
     * 自定义监听类
     */
    class CustomListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            //事件处理
            if (e.getSource() == jbtn1) {
                JOptionPane.showMessageDialog(null, "登录成功!");
            } else if (e.getSource() == jbtn2) {
                int ope = JOptionPane.showConfirmDialog(null, "确认退吗?");
                System.out.println("选择:" + ope);       //0,1,2
            } else if (e.getActionCommand().equals("卸载")) {
                String ly = JOptionPane.showInputDialog(null, "请告诉我们理由以便后续改进");
                System.out.println("理由:" + ly);
            }
        }
    }

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

执行结果

请添加图片描述

四、面板类

Jpanel是轻量级组件,属中间容器,JFrame若是一块黑板,JPanel就是贴纸或海报。

案例四(Jpanel测试)

  1. src目录下创建resources包(文件夹),并在该包下添加两张图片(img01.jpg,img02.jpg)

请添加图片描述

  1. 创建ImgUtil类
package com.hpr.util;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImgUtil extends JPanel {

    //图片路径
    private String imgPath;

    public ImgUtil(String imgPath) {
        this.imgPath = imgPath;
    }

    @Override
    public void paint(Graphics g) {
        try {
            //读取图片(文件操作)
            BufferedImage image = ImageIO.read(new File(imgPath));
            //绘制图片
            g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
            /*
             *g.drawLine():绘制线段
             *g.drawArc():画圆
             *g.fillArc():填充圆
             *g.drawRect():画矩形
             *g.fillRect():填充矩形
             *g.drawString():绘制字符串
             **/
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 创建JPanelTest类
package com.hpr.page;

import com.hpr.util.ImgUtil;

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

public class JPanelTest extends JFrame {
    JPanel jp1, jp2, jp3;

    public JPanelTest() {
        setTitle("JPanel测试");
        setSize(600, 400);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);

        jp1 = new JPanel();
        jp1.setBackground(Color.green);
        jp1.setBounds(100, 30, 400, 60);

        jp2 = new ImgUtil("./src/resources/img01.jpg");
        jp2.setBounds(20, 120, 260, 200);

        jp3 = new ImgUtil("./src/resources/img02.jpg");
        jp3.setBounds(310, 120, 260, 200);

        add(jp1);
        add(jp2);
        add(jp3);
        setVisible(true);
    }

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

执行结果

请添加图片描述

总结

重点

  1. JavaGUI容器、组件、事件;
  2. 监听器;
  3. 封装、继承、多态的综合应用。

难点

  1. 事件监听处理;
  2. 自定义布局的坐标系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值