【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线进入设备的命令行页…...
SpringSecurity-1(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)
SpringSecurity 1 初识权限管理1.1 权限管理的概念1.2 权限管理的三个对象1.3 什么是SpringSecurity 2 SpringSecurity第一个入门程序2.1 SpringSecurity需要的依赖2.2 创建web工程2.2.1 使用maven构建web项目2.2.2 配置web.xml2.2.3 创建springSecurity.xml2.2.4 加载springSe…...
Java高级
类变量/静态变量package com.study.static_; 通过static关键词声明,是该类所有对象共享的对象,任何一个该类的对象去访问他的时候,取到的都是相同的词,同样任何一个该类的对象去修改,所修改的也是同一个对象. 如何定义及访问? 遵循相关访问权限 访问修饰符 static 数据类型…...
python实现图像分割算法3
python实现区域增长算法 算法原理基本步骤数学模型Python实现详细解释优缺点应用领域区域增长算法是一种经典的图像分割技术,它的目标是将图像划分为多个互不重叠的区域。该算法通过迭代地合并与种子区域相似的邻域像素来实现分割。区域增长算法通常用于需要精确分割的场景,如…...
解密XXE漏洞:原理剖析、复现与代码审计实战
在网络安全领域,XML外部实体(XXE)漏洞因其隐蔽性和危害性而备受关注。随着企业对XML技术的广泛应用,XXE漏洞也逐渐成为攻击者们利用的重点目标。一个看似无害的XML文件,可能成为攻击者入侵系统的利器。因此,…...
Spring Boot集成Resilience4J实现限流/重试/隔离
1.前言 上篇文章讲了Resilience4J实现熔断功能,文章详见:Spring Boot集成Resilience4J实现断路器功能 | Harries Blog™,本篇文章主要讲述基于Resilience4J实现限流/重试/隔离。 2.代码工程 pom.xml <dependency><groupId>io…...
谷粒商城实战笔记-119~121-全文检索-ElasticSearch-mapping
文章目录 一,119-全文检索-ElasticSearch-映射-mapping创建1,Elasticsearch7开始不支持类型type。2,mapping2.1 Elasticsearch的Mapping 二,120-全文检索-ElasticSearch-映射-添加新的字段映射三,121-全文检索-Elastic…...
Java 并发编程:Java 线程池的介绍与使用
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 024 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
ubuntu上安装HBase伪分布式-2024年08月04日
ubuntu上安装HBase伪分布式-2024年08月04日 1.HBase介绍2.HBase与Hadoop的关系3.安装前言4.下载及安装5.单机配置6.伪分布式配置 1.HBase介绍 HBase是一个开源的非关系型数据库,它基于Google的Bigtable设计,用于支持对大型数据集的实时读写访问。HBase有…...
Mojo的特征与参数(参数化部分)详解
许多语言都具有元编程功能:即编写生成或修改代码的代码。Python 具有动态元编程功能:装饰器、元类等功能。这些功能使 Python 非常灵活且高效,但由于它们是动态的,因此会产生运行时开销。其他语言具有静态或编译时元编程功能,如 C 预处理器宏和 C++ 模板。这些功能可能受到…...
C++数组、vector求最大值最小值及其下标
使用 <algorithm> 头文件来查找数组或向量中最大值、最小值及其索引 #include <iostream> #include <vector> #include <algorithm> // 包含 std::max_element 和 std::min_elementint main() {std::vector<int> vec {3, 1, 4, 2, 5};// 查找最…...
百度上做网站模板/网站开发一般多少钱
1. 在虚拟机中新安装系统的时候,通常因为时间过了很长,软件有更新之后,安装vim的时候会出错,因此,装完系统先要做的: cd /var/lib/dpkg/updates/lssudo apt-get update sudo apt-get upgrate//更新最新的套…...
wordpress用户后台插件/网络推广怎么找客户资源
一、 中间层各单元介绍二、 中间层重要的类介绍三、 帮大家分析一下RO是怎么工作的四、 多核时代下的多线程编程----帮大家读懂TThread类(重点)1、 中间层各单元介绍单元名 作用 BestSQL.pas BestCo…...
三水区网站建设/搜狗网页
《C语言程序设计》模拟试题(一)一、填空(每空1分,共10分)1、设x为整型变量,值为1,则表达式(x&&1) (x%2)的值为_______2、与二进制数101等值的十进制数为______3、若已知a10,b20,则表达式!a4、结构化程序设计所…...
国家发改委建设部网站/怎样有效的做网上宣传
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[|-]val[ymwdHMS]] ...[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [format]参数解析:-j:使用-j才能使用-f-n:默认情况下,如果定时进程正在运行,date命令会在…...
做网站开发平台/网站推广seo
单个数据库配置 : 一般spring容器启动时,通过PropertyPlaceholderConfigurer类读取jdbc.properties文件里的数据库配置信息。通过这个原理,我们把加密后的数据库配置信息放到jdbc.properties文件里,然后自定义一个继承PropertyPla…...
成都如何做网站/网站seo平台
前言上节我们讲了okhttp的整体的流程,里面的核心方法之一是getResponseWithInterceptorChain() ,这个方法应该知道吧?通过拦截器层层处理返回Response;这个方法中其实应用了责任链设计模式。今天主要讲一下它是如何应用的…...