【JAVA入门】Day17 - GUI

news2024/9/24 13:13:10

【JAVA入门】Day17 - GUI


文章目录

  • 【JAVA入门】Day17 - GUI
  • 一、组件
  • 二、事件


        GUI 即图形化界面。

一、组件

        一个 Java 的图形化界面项目主要用到了下面几种组件。

  • Java 中最外层的窗体叫做 JFrame。
  • Java 中最上层的菜单叫做 JMenuBar。
  • Java 中管理文字和图片的容器叫做 JLabel。

【练习1】创建主界面1。

public class App {
    public static void main(String[] args) {
        //表示程序的启动入口
        //想要启动哪个界面,就创建它的对象
        new LoginJFrame();      //调用默认空参构造方法
    }
}
public class GameJFrame extends JFrame {
    //1.创建一个游戏的主界面
    //属性(宽 高)   行为 setSize setVisible
    //规定:GameJFrame 这个界面表示的是游戏的主界面
    public GameJFrame() {
        this.setSize(603, 680);
        this.setVisible(true);
    }
}
public class RegisterJFrame extends JFrame {
    //注册界面
    public RegisterJFrame() {
        this.setSize(488, 430);
        this.setVisible(true);
    }
}
public class LoginJFrame extends JFrame {
    //登录界面
    public LoginJFrame() {
        this.setSize(488, 430);
        this.setVisible(true);
    }
}

【练习2】设置 GameJFrame的相关方法。

 public GameJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置游戏的关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //让窗体显示出来,建议写在最后
        this.setVisible(true);
    }

【练习3】在 GameJFrame 窗体上方添加菜单。
在这里插入图片描述

 public GameJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置游戏的关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


        //初始化菜单
        //创建整个的菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单上的两个选项的对象(功能   关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reloginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //将每一个选项下的条目添加到选项当中
        functionJMenu.add(replayItem);
        functionJMenu.add(reloginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);

        //将菜单里的两个选项添加到菜单当中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);

        //让窗体显示出来,建议写在最后
        this.setVisible(true);
    }

        将构造方法中的代码进行抽取,抽取到不同的方法中。

 public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //让窗体显示出来,建议写在最后
        this.setVisible(true);
    }

    private void initJMenuBar() {
        //初始化菜单
        //创建整个的菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单上的两个选项的对象(功能   关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //创建选项下面的条目对象
        JMenuItem replayItem = new JMenuItem("重新游戏");
        JMenuItem reloginItem = new JMenuItem("重新登录");
        JMenuItem closeItem = new JMenuItem("关闭游戏");

        JMenuItem accountItem = new JMenuItem("公众号");

        //将每一个选项下的条目添加到选项当中
        functionJMenu.add(replayItem);
        functionJMenu.add(reloginItem);
        functionJMenu.add(closeItem);

        aboutJMenu.add(accountItem);

        //将菜单里的两个选项添加到菜单当中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置游戏的关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

【练习4】添加图片。

 private void initImage() {
        //创建一个图片ImageIcon的对象
        ImageIcon icon = new ImageIcon("D:\\IdeaProjects\\PuzzleGame\\image\\daxiaoqiao\\1.jpg");
        //创建一个JLabel的对象(管理容器)
        JLabel jLabel = new JLabel(icon);
        //把管理容器添加到界面中
        this.add(jLabel);
    }

        注意:窗体和图片之间其实还有一个隐藏的容器(布局方式容器),这个容器可以用 getContentPane() 来获取,我们添加的图片,实质上是添加进了这个容器当中,如果没有设定这个容器的特殊要求,它会默认把图片放到居中位置。如果不想将图片放到正中央,就需要把这个默认机制取消掉,我们可以使用 setLayout(null) 来实现。

  //在JFrame的初始化方法中
  //取消掉默认居中布局
  this.setLayout(null);
    private void initImage() {
        //创建一个图片ImageIcon的对象
        ImageIcon icon = new ImageIcon("D:\\IdeaProjects\\PuzzleGame\\image\\daxiaoqiao\\1.jpg");
        //创建一个JLabel的对象(管理容器)
        JLabel jLabel = new JLabel(icon);
        //指定图片位置
        jLabel.setBounds(0, 0, 105, 105);
        //把管理容器添加到布局容器中
        this.getContentPane().add(jLabel);
    }

【练习5】打乱一维数组中的数据。
需求:把一个一维数组中的数据:0~15打乱顺序,然后再以4个一组的方式添加到二维数组中。

package test;

import java.util.Random;

public class RandomTest {
    public static void main(String[] args) {
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

        Random r = new Random();
        for(int i = 0; i < tempArr.length; i++) {
            //获取随机索引
            int index = r.nextInt(tempArr.length);
            int temp = 0;
            //交换两个索引上的数据
            temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
            //遍历数组
            System.out.print(tempArr[i]+" ");
        }
        System.out.println();


        //创建一个二维数组
        int[][] data = new int[4][4];
        //给二维数组添加数据
        //遍历tempArr每一个元素,把每一个元素依次添加到二维数组中
        for (int i = 0; i < tempArr.length; i++) {
            data[i / 4][i % 4] = tempArr[i];
        }
        //遍历二维数组
        for(int i = 0 ;i < 4; i++) {
            for(int j = 0; j < 4; j++) {
                System.out.print(data[i][j] + " ");
            }
            System.out.println();
        }
    }
}

【练习6】打乱图片。

 private void initData() {
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

        Random r = new Random();
        for(int i = 0; i < tempArr.length; i++) {
            //获取随机索引
            int index = r.nextInt(tempArr.length);
            //交换两个索引上的数据
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;

        }
        //给二维数组添加数据
        //遍历tempArr每一个元素,把每一个元素依次添加到二维数组中
        for (int i = 0; i < tempArr.length; i++) {
            data[i / 4][i % 4] = tempArr[i];        //巧妙运用数学知识,一行完成二维数组元素的添加
        }
    }
  private void initImage() {
        for(int i = 0 ; i < 4; i++){
            for (int j = 0; j < 4; j++) {
                //创建一个图片ImageIcon的对象
                ImageIcon icon = new ImageIcon("D:\\IdeaProjects\\PuzzleGame\\image\\daxiaoqiao\\" + data[i][j] + ".jpg");
                //创建一个JLabel的对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //指定图片位置
                jLabel.setBounds(105 * j, 105 * i + 4, 105, 105);
                //把管理容器添加到界面中
                this.getContentPane().add(jLabel);
            }
        }

在这里插入图片描述

二、事件

        事件,就是可以被组件识别的操作。当你对组件做了某种事情后,就会执行相应的代码。
        GUI 中的事件源可以是按钮、图片、窗体等等控件。
        鼠标点击、鼠标划入等等操作都统称为事件
        当事件源上发生了某个事件,则执行某段代码,这个行为叫做绑定监听

  • KeyListner                键盘监听
  • MouseListener         鼠标监听
  • ActionListener          动作监听

【练习7】写一个按钮的事件监听。
        按钮用 JButton 类创建。事件监听需要导包,导入 ActionEvent 和 ActionListener。

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

public class EventTest {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        //设置界面宽高
        jFrame.setSize(603, 680);
        //设置界面标题
        jFrame.setTitle("事件演示");
        //设置界面置顶
        jFrame.setAlwaysOnTop(true);
        //设置界面居中
        jFrame.setLocationRelativeTo(null);
        //设置关闭模式
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //取消组件默认居中放置
        jFrame.setLayout(null);


        //创建一个按钮对象
        JButton jbt = new JButton("点我");
        //设置按钮位置和宽高
        jbt.setBounds(0,0,100,50);
        //给按钮添加动作监听
        //jbt:组件对象,表示要给哪个组件添加事件
        //addActionListener:表示我要给组件添加哪个事件监听(动作监听包括两种:鼠标左键点击,空格按下)
        //()中应该传入一个接口的实现类对象,该对象是ActionListener的对象,可以用匿名内部类作为参数
        //该参数表示:事件被触发后要执行的代码
        jbt.addActionListener(new ActionListener() {
        	@Override
            public void actionPerformed(ActionEvent e) {
            	System.out.println("按钮被点击了");
            }
        });
        //把按钮添加入窗体
        jFrame.getContentPane().add(jbt);
        //显示窗体
        jFrame.setVisible(true);
    }
}

        事件监听还有另一种写法,可以让当前界面去实现 ActionListener 接口。
        写一个窗体实现 ActionListener 接口。

package test;

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

public class MyJFrame extends JFrame implements ActionListener {

    //创建2个按钮,必须在成员位置
    JButton jbt1 = new JButton("点我!");
    JButton jbt2 = new JButton("点我。");
        //构造方法
    MyJFrame() {
        this.setSize(600,600);
        //设置界面的标题
        this.setTitle("登录");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置窗口的关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //设置窗口的Layout
        this.setLayout(null);

        //设置按钮位置大小
        jbt1.setBounds(0,0,100,50);
        jbt2.setBounds(202,0,100,50);

        //给按钮添加事件
        //因为当前类实现了ActionListener接口,所以该类本身对象即可作为参数反传递给addActionListener()方法
        jbt1.addActionListener(this);
        jbt2.addActionListener(this);

        //把按钮添加到窗口中
        this.getContentPane().add(jbt1);
        this.getContentPane().add(jbt2);

        //显示窗体
        this.setVisible(true);

    }
    //实现ActionListener接口,重写actionPerformed方法
    @Override
    public void actionPerformed(ActionEvent e) {
        //对当前的按钮进行判断
        //获取当前被操作的那个按钮对象
        Object source = e.getSource();
        if(source == jbt1) {
            jbt1.setSize(200,200);
            System.out.println("按钮1被按下");
        }else{
            Random r = new Random();
            jbt2.setLocation(r.nextInt(500),r.nextInt(500));
            System.out.println("按钮2被按下");
        }
    }
}

        测试类用来创建窗口。

package test;

public class EventTest2 {
    public static void main(String[] args) {
        MyJFrame myJFrame = new MyJFrame();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速体验LLaMA3模型微调(超算互联网平台国产异构加速卡DCU)

序言 本文以 LLaMA-Factory 为例&#xff0c;在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE&#xff0c;对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并。 超算互联网平台 异构加速卡AI 显存64GB PCIE 一、参考资料 github仓库代码&#xff1a;LLaMA-Fac…

C#中的Winform基础

program 每个Windows应用程序都会有一个Program类——程序入口点 [STAThread] ----指示应用程序的COM线程模型是单线程单元&#xff08;如果无此特性&#xff0c;无法工作&#xff09; static voidMain() —— 入口 System.Windows.Forms.Application类提供一系列静态方法和…

【C++】一堆数组案例 元素逆置

所谓元素逆置就是把一堆数组的元素顺序反过来 例如一堆数组的为 1&#xff0c;2&#xff0c;3&#xff0c;4 那么它的逆置为 4&#xff0c;3&#xff0c;2&#xff0c;1 逆置过程运用赋值存储的思想&#xff0c;先把第一个数组存贮到一个变量中&#xff0c;然后把末尾数组…

开源LivePortrait,快速实现表情包自定义

最近可灵AI很火&#xff0c;看到网上生成的效果也很赞啊&#xff0c;之前发现快手可灵开源了LivePortrait&#xff0c;今天去玩了一下&#xff0c;很有意思。 比如下图官方展示效果&#xff1a; 这些图片开始自带表情了&#xff0c;主要就是通过LivePortrait来实现。 LivePor…

浏览器用户文件夹详解 - Top Sites(七)

1. TopSites简介 1.1 什么是TopSites文件&#xff1f; TopSites文件是Chromium浏览器中用于存储用户访问频率最高的网站信息的一个重要文件。每当用户在浏览器中访问网站时&#xff0c;这些信息都会被记录在TopSites文件中。通过这些记录&#xff0c;浏览器可以为用户提供个性…

校园抢课助手【7】-抢课接口限流

在上一节中&#xff0c;该接口已经接受过风控的处理&#xff0c;过滤掉了机器人脚本请求&#xff0c;剩下都是人为的下单请求。为了防止用户短时间内高频率点击抢课链接&#xff0c;海量请求造成服务器过载&#xff0c;这里使用接口限流算法。 先介绍下几种常用的接口限流策略…

脚拉脚模型笔记

脚拉脚模型 ⌈♪⌋例题&#xff1a; 辅助线&#xff08;中点&#xff09;做法&#xff1a; 倍长中线Rt △ △ △ 斜边中线等腰 △ △ △ 三线合一中位线 需要&#xff1a;两个等腰三角形&#xff0c;顶角互补 共__底点__ 底角需要连接 解&#xff1a; ∵ D Q 1 / 2 A B O…

中国人工智能最好50所大学排名-2024年最强学校名单

人工智能最强的学校包含&#xff1a;清华大学、上海交通大学、南京大学、西安电子科技大学、电子科技大学、中国科学技术大学、哈尔滨工业大学、华中科技大学、东南大学、浙江大学等学校。这些都是人工智能专业排名全国前十的名牌大学。 圆梦小灯塔将在下文继续为2024年高考生…

鸿蒙应用开发 DevEcoStudio 汉化

步骤 DevEcoStudio 是默认支持中文的&#xff0c;只是默认是关闭的&#xff0c;需要在已安装的插件中搜索 Chinese 关键字&#xff0c;然后启用并重启即可&#xff08;注意&#xff1a;是在已安装的插件中搜索&#xff09;。 1. 2. 3. 重启就行

滚珠花键:新能源汽车传动系统的核心动力传递者

在日常生活中&#xff0c;汽车已经成为了必不可少的交通工具&#xff0c;尤其是新能源汽车。而滚珠花键作为传动系统中的重要组成部分&#xff0c;在传动系统方面的作用不容忽视。 随着科技的不断发展&#xff0c;汽车行业也在不断进步&#xff0c;滚珠花键作为高精度的机械传动…

PE安装win11原版系统“无法创建新的分区,也找不到现有的分区”和“windows无法对计算机进行启动到下一个安装阶段”的解决办法

问题1 针对“无法创建新的分区&#xff0c;也找不到现有的分区”&#xff1a; 解决办法&#xff1a; 用Diskgenius等分区工具删除整个分区&#xff0c;不要在分区工具里新建分区&#xff0c;而是在安装系统选择安装磁盘的时候&#xff0c;直接选择这个磁盘&#xff0c;从而完成…

五. TensorRT API的基本使用-build-model-from-scratch

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 model.cpp 3. 案例3.1 sample_conv3.2 sample_permute3.3 sample_reshape3.4 sample_batchNorm3.5 sample_cbr 4. 补充说明总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。…

《学会 SpringMVC 系列 · 写入拦截器 ResponseBodyAdvice》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

3.4数组和特殊矩阵

3.4.1数组的定义 数组是由n个相同类型的数据元素构成的有序序列 数组是线性表的推广,一个数组可以视为一个线性表 数组一旦被定义,其长度不会再改变,所以数组只会有存取元素和修改元素的操作 3.4.2数组的存储结构 多维数组 有两种映射方法:按行优先和按列优先 按行优先 …

2024 年最值得阅读的 10 个外国技术网站

从网络上数以千计的博客中挑选出最好的技术网站&#xff0c;并根据相关性、权威性、社交媒体关注者和新鲜度进行排名。 1. TechCrunch TechCrunch 是一家领先的科技媒体&#xff0c;致力于深入分析初创公司、评论新的互联网产品和发布科技新闻。该网站是科技专业人士和爱好者…

【传知代码】实体关系抽取(论文复现)

当谈论信息提取领域的最前沿时&#xff0c;实体关系抽取无疑是其中一颗耀眼的明星。从大数据时代的信息海洋中提炼出有意义的关系&#xff0c;不仅是科技进步的体现&#xff0c;更是人类对知识管理和智能决策迫切需求的响应。本文将探索实体关系抽取的核心技术、应用场景及其在…

域控搭建(windows 2012 R2和win10)

域控搭建 环境准备 两台windows虚拟机 主域控为&#xff1a;windows server2012 子域为&#xff1a;win10 虚拟机设置网段 Win10网络设置 Windows server2012网络设置 Windows server2012网络适配器 设置 识别成功 更改计算机名字 等待重启 Win10网络适配器 设置 识别成功 …

opencv-图像透视变换

透射变换是视角变化的结果&#xff0c;是指利用透视中心&#xff0c;像点&#xff0c;目标点共线的条件&#xff0c;按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度&#xff0c;破坏原有的投影光束&#xff0c;仍能保持承影面上投影几何图形不变的变化) 它的本质将图…

QT实现步进电机控制和IMU数据读取显示

实现功能&#xff1a; 1.两步进电机分别使能和循环运动&#xff0c;可以设置循环次数、循环里分别运行的角度、旋转的速度和加减速度等等&#xff0c;在最下方的表格里显示发送和接收的CAN报文 2.读取水平电机当前位置和速度并画图显示&#xff0c;示波器暂停、缩放、滑动等功…

CVPR24《Neural Markov Random Field for Stereo Matching》

论文地址&#xff1a; https://arxiv.org/abs/2403.11193 源码地址&#xff1a; https://github.com/aeolusguan/NMRF 概述 手工设计的MRF模型在传统的立体匹配中占据主导地位&#xff0c;但与端到端的深度学习模型相比&#xff0c;其建模准确性不足。尽管深度学习大大改进了MR…