【JAVA入门】Day17 - GUI
【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() {@Overridepublic 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);//设置窗口的Layoutthis.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方法@Overridepublic 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();}
}
相关文章:
【JAVA入门】Day17 - GUI
【JAVA入门】Day17 - GUI 文章目录 【JAVA入门】Day17 - GUI一、组件二、事件 GUI 即图形化界面。 一、组件 一个 Java 的图形化界面项目主要用到了下面几种组件。 Java 中最外层的窗体叫做 JFrame。Java 中最上层的菜单叫做 JMenuBar。Java 中管理文字和图片的容器叫做 JLab…...
OpenAI API continuing conversation in a dialogue
题意:在对话中继续使用OpenAI API进行对话 问题背景: I am playing around with the openAI API and I am trying to continue a conversation. For example: 我正在尝试使用OpenAI API,并试图继续一段对话。例如: import open…...
6.前端怎么做一个验证码和JWT,使用mockjs模拟后端
流程图 创建一个发起请求 创建一个方法 getCaptchaImg() {this.$axios.get(/captcha).then(res > {console.log(res);this.loginForm.token res.data.data.tokenthis.captchaImg res.data.data.captchaImgconsole.log(this.captchaImg)})}, captchaImg: "", 创…...
Python酷库之旅-第三方库Pandas(064)
目录 一、用法精讲 251、pandas.Series.tz_localize方法 251-1、语法 251-2、参数 251-3、功能 251-4、返回值 251-5、说明 251-6、用法 251-6-1、数据准备 251-6-2、代码示例 251-6-3、结果输出 252、pandas.Series.at_time方法 252-1、语法 252-2、参数 252-3…...
MATLAB基础操作(二)
11.求方程2x^5-3x^371x^2-9x130的全部跟 >> p[2,0,-3,71,-9,13]; >> xroots(p); 12.求解线性方程组2x3y-z2 8x2y3z4 45x3y9z23 >> a[2,3,-1;8,2,3;45,3,9];%建立系数矩阵a >> b[2,4,23]%建立列向量b >> …...
win10 繁体简体字切换
1. 使用快捷键 Ctrl Shift F 2. 在语言设置中更改 | 点击任务栏上的“开始”按钮。 | 选择“设置”(齿轮图标)。 | 在弹出的“Windows 设置”窗口中,点击“时间和语言”。 | 选择“语言”选项。 | 在右侧找到您正在使用的输入法ÿ…...
R语言统计分析——描述性统计
参考资料:R语言实战【第2版】 1、整体统计 对于R语言基础安装,可以使用summary()函数来获取描述性统计量。summary()函数提供了最小值、最大值、四分位数、中位数和算术平均数,以及因子向量和逻辑向量的频数统计。 myvars<-c("mpg&…...
为什么需要合成数据进行机器学习
为什么需要合成数据进行机器学习 文章目录 一、说明二、数据缩放问题三、合成数据的前景与进展四、将合成数据与 LLM 结合使用的最佳实践五、通过合成数据释放创新 一、说明 数据是人工智能的命脉。如果没有高质量的、具有代表性的训练数据,我们的机器学习模型将毫无…...
传统CS网络的新生——基于2G网络的远程灌溉实现
概述:iphone 实现远程电话触发,实现灌溉绿植的一般方法 方法一: 远程电话触发,音频线左右声道会产生一个信号,可以在后端利用SR锁存器暂存信号,后级可以接相应的控制电路实现灌溉。 方法二: 同…...
EasyAR_稀疏空间图
EasyAR_稀疏空间图 EasyAR4.6.3 丨 Unity2020.3.15f2 1.创建稀疏空间地图 在EasyAR开发中心后台创建Scene许可证密钥,并且使用稀疏空间地图 2.设置稀疏空间地图库名,对稀疏空间地图进行管理,设置密钥 3.复制密钥到Unity中 添加Spatial Map Ap…...
设计模式 - Singleton pattern 单例模式
文章目录 定义单例模式的实现构成构成UML图 单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现 总结其他设计模式文章:最后 定义 单例模式是一种创建型设计模式,它用来保证一个类只有一个实…...
显示学习5(基于树莓派Pico) -- 彩色LCD的驱动
和这篇也算是姊妹篇,只是一个侧重SPI协议,一个侧重显示驱动。 总线学习3--SPI-CSDN博客 驱动来自:https://github.com/boochow/MicroPython-ST7735 所以这里主要还是学习。 代码Init def __init__( self, spi, aDC, aReset, aCS) :"&…...
ros vscode配置gdb调试
ros工程vscode下配置gdb的调试环境需要添加几个配置文件,下面贴一下用得到的几个配置文件。 c_cpp_properties.json,这个配置作用是方便代码跳转。 {"configurations": [{"browse": {"databaseFilename": "${defau…...
C 环境设置
C 环境设置 C语言作为一种广泛使用的编程语言,其环境设置是每个开发者必须掌握的基本技能。本文将详细介绍如何在不同的操作系统上设置C语言开发环境,包括Windows、macOS和Linux系统。我们将涵盖安装编译器、配置开发环境以及编写和运行第一个C程序。 Windows系统上的C环境…...
Linux-ubuntu操作系统装机步骤
1、下载iso镜像 方法一、访问Ubuntu官网 方法二、163镜像 2、制作U盘启动盘 方法一、UltraISO(软碟通)写入硬盘映像,参考该 [链接] 方法二、Rufus,参考该 [链接] 3、安装 参考该 [链接] 4、相关配置 Ubuntu 换源 参考链接…...
马尔科夫毯:信息屏障与状态独立性的守护者
马尔科夫毯(Markov Blanket)是概率图模型中的一个重要概念,用于描述某一节点在网络中的信息独立性和条件依赖关系。马尔科夫毯定义了一个节点的“信息屏障”,即给定马尔科夫毯中节点的状态,该节点与网络中其他节点的状…...
Pandas的30个高频函数使用介绍
Pandas是Python中用于数据分析的一个强大的库,它提供了许多功能丰富的函数。本文介绍其中高频使用的30个函数。 read_csv(): 从CSV文件中读取数据并创建DataFrame对象。 import pandas as pd df pd.read_csv(data.csv) read_excel(): 从Excel文件中读取数据…...
1. protobuf学习
文章目录 1. protobuf介绍1.1 ProtoBuf使用场景说明2. 其他序列化介绍2.1 Json2.1.1 使用Json序列化2.1.2 Json反序列化2.2 其他可选地序列化和反序列化3. protoBuf3.1 protobuf数据类型3.2 protobuf使用步骤3.2.1 定义proto文件3.2.2 编译proto文件3.2.2.1 安装protocol buffe…...
Java面试题:SpringBean的生命周期
SpringBean的生命周期 BeanDefinition Spring容器在进行实例化时,会将xml配置的信息封装成BeanDefinition对象 Spring根据BeanDefinition来创建Bean对象 包含很多属性来描述Bean 包括 beanClassName:bean的类名,通过类名进行反射 initMethodName:初始化方法名称 proper…...
50 IRF检测MAD-BFD
IRF 检测MAD-BFD IRF配置思路 网络括谱图 主 Ten-GigabitEthernet 1/0/49 Ten-GigabitEthernet 1/0/50 Ten-GigabitEthernet 1/0/51 备 Ten-GigabitEthernet 2/0/49 Ten-GigabitEthernet 2/0/50 Ten-GigabitEthernet 2/0/51 1 利用console线进入设备的命令行页…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
