当前位置: 首页 > news >正文

【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

题意&#xff1a;在对话中继续使用OpenAI API进行对话 问题背景&#xff1a; I am playing around with the openAI API and I am trying to continue a conversation. For example: 我正在尝试使用OpenAI API&#xff0c;并试图继续一段对话。例如&#xff1a; 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. 在语言设置中更改 | 点击任务栏上的“开始”按钮。 | 选择“设置”&#xff08;齿轮图标&#xff09;。 | 在弹出的“Windows 设置”窗口中&#xff0c;点击“时间和语言”。 | 选择“语言”选项。 | 在右侧找到您正在使用的输入法&#xff…...

R语言统计分析——描述性统计

参考资料&#xff1a;R语言实战【第2版】 1、整体统计 对于R语言基础安装&#xff0c;可以使用summary()函数来获取描述性统计量。summary()函数提供了最小值、最大值、四分位数、中位数和算术平均数&#xff0c;以及因子向量和逻辑向量的频数统计。 myvars<-c("mpg&…...

为什么需要合成数据进行机器学习

为什么需要合成数据进行机器学习 文章目录 一、说明二、数据缩放问题三、合成数据的前景与进展四、将合成数据与 LLM 结合使用的最佳实践五、通过合成数据释放创新 一、说明 数据是人工智能的命脉。如果没有高质量的、具有代表性的训练数据&#xff0c;我们的机器学习模型将毫无…...

传统CS网络的新生——基于2G网络的远程灌溉实现

概述&#xff1a;iphone 实现远程电话触发&#xff0c;实现灌溉绿植的一般方法 方法一&#xff1a; 远程电话触发&#xff0c;音频线左右声道会产生一个信号&#xff0c;可以在后端利用SR锁存器暂存信号&#xff0c;后级可以接相应的控制电路实现灌溉。 方法二&#xff1a; 同…...

EasyAR_稀疏空间图

EasyAR_稀疏空间图 EasyAR4.6.3 丨 Unity2020.3.15f2 1.创建稀疏空间地图 在EasyAR开发中心后台创建Scene许可证密钥&#xff0c;并且使用稀疏空间地图 2.设置稀疏空间地图库名&#xff0c;对稀疏空间地图进行管理&#xff0c;设置密钥 3.复制密钥到Unity中 添加Spatial Map Ap…...

设计模式 - Singleton pattern 单例模式

文章目录 定义单例模式的实现构成构成UML图 单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现 总结其他设计模式文章&#xff1a;最后 定义 单例模式是一种创建型设计模式&#xff0c;它用来保证一个类只有一个实…...

显示学习5(基于树莓派Pico) -- 彩色LCD的驱动

和这篇也算是姊妹篇&#xff0c;只是一个侧重SPI协议&#xff0c;一个侧重显示驱动。 总线学习3--SPI-CSDN博客 驱动来自&#xff1a;https://github.com/boochow/MicroPython-ST7735 所以这里主要还是学习。 代码Init def __init__( self, spi, aDC, aReset, aCS) :"&…...

ros vscode配置gdb调试

ros工程vscode下配置gdb的调试环境需要添加几个配置文件&#xff0c;下面贴一下用得到的几个配置文件。 c_cpp_properties.json&#xff0c;这个配置作用是方便代码跳转。 {"configurations": [{"browse": {"databaseFilename": "${defau…...

C 环境设置

C 环境设置 C语言作为一种广泛使用的编程语言,其环境设置是每个开发者必须掌握的基本技能。本文将详细介绍如何在不同的操作系统上设置C语言开发环境,包括Windows、macOS和Linux系统。我们将涵盖安装编译器、配置开发环境以及编写和运行第一个C程序。 Windows系统上的C环境…...

Linux-ubuntu操作系统装机步骤

1、下载iso镜像 方法一、访问Ubuntu官网 方法二、163镜像 2、制作U盘启动盘 方法一、UltraISO&#xff08;软碟通&#xff09;写入硬盘映像&#xff0c;参考该 [链接] 方法二、Rufus&#xff0c;参考该 [链接] 3、安装 参考该 [链接] 4、相关配置 Ubuntu 换源 参考链接…...

马尔科夫毯:信息屏障与状态独立性的守护者

马尔科夫毯&#xff08;Markov Blanket&#xff09;是概率图模型中的一个重要概念&#xff0c;用于描述某一节点在网络中的信息独立性和条件依赖关系。马尔科夫毯定义了一个节点的“信息屏障”&#xff0c;即给定马尔科夫毯中节点的状态&#xff0c;该节点与网络中其他节点的状…...

Pandas的30个高频函数使用介绍

Pandas是Python中用于数据分析的一个强大的库&#xff0c;它提供了许多功能丰富的函数。本文介绍其中高频使用的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线进入设备的命令行页…...

手把手教你用FastBlur打造高级感UI:从对话框背景到沉浸式音乐播放器的完整实现

用FastBlur打造高级UI的实战指南&#xff1a;从对话框到音乐播放器的设计进化 毛玻璃效果早已从iOS的视觉语言演变为现代移动应用设计的通用元素。这种半透明模糊效果不仅能提升界面层次感&#xff0c;还能在不分散用户注意力的情况下创造视觉焦点。本文将带你深入Android平台实…...

在AutoDL上从零部署YOLO训练环境:新手避坑指南

1. 为什么选择AutoDL部署YOLO训练环境 第一次接触目标检测任务时&#xff0c;我和大多数新手一样被各种环境配置问题折磨得够呛。本地显卡跑不动YOLOv5&#xff0c;租用云服务器又担心操作复杂&#xff0c;直到发现了AutoDL这个宝藏平台。它最大的优势就是把复杂的GPU实例管理简…...

git -- 替换项目已经存在的 git 远程仓库地址

要将项目中的 Git 远程仓库地址修改为新的地址&#xff08;http://192.168.3.32:9980/java/transketch-portal-backend&#xff09;&#xff0c;你可以按照以下步骤操作&#xff1a;方法一&#xff1a;使用 Git 命令行打开终端或命令提示符导航到你的项目目录运行以下命令&…...

[具身智能-125]:RQT(Robot Qt),一个可以全方位监控ROS2系统内部节点工作状态的可视化超级终端!!!

如果说 RViz2 是机器人的“眼睛”&#xff08;看 3D 世界&#xff09;&#xff0c;那么 RQT 就是机器人的“听诊器”和“控制台”。它基于 Qt 框架开发&#xff0c;采用插件化架构&#xff0c;让你能在一个窗口里完成对 ROS2 系统内部状态的全方位监控与调试。为了让你更好地利…...

深入解析串口通信:从RS232到RS485的工业应用实战

1. 串口通信的工业应用基础 第一次接触工业自动化项目时&#xff0c;我被现场密密麻麻的线缆搞得头晕眼花。直到老师傅指着角落里不起眼的两根双绞线说&#xff1a;"这条RS485总线控制着整条生产线的30台设备"&#xff0c;我才意识到串口通信在工业领域的强大之处。 …...

AI辅助开发:用提示词让快马AI自动生成技术职级成长路径分析应用

AI辅助开发&#xff1a;用提示词让快马AI自动生成技术职级成长路径分析应用 最近在研究技术职级体系时&#xff0c;发现很多开发者对阿里P10这类高级职位的成长路径特别感兴趣。但手动整理这些信息费时费力&#xff0c;于是尝试用AI辅助开发的方式快速生成一个可视化分析工具。…...

MultiHighlight插件完全指南:5步提升代码阅读效率300%

MultiHighlight插件完全指南&#xff1a;5步提升代码阅读效率300% 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors &#x1f3a8;&#x1f4a1; 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight 在当今快…...

GEO 优化系统实战指南:从架构设计到算法落地

1. GEO优化系统架构设计实战 第一次接触GEO优化系统时&#xff0c;我被各种空间计算概念搞得晕头转向。直到真正动手搭建系统才发现&#xff0c;架构设计就像搭积木&#xff0c;只要掌握关键模块的组装逻辑&#xff0c;就能构建出稳定高效的地理优化引擎。下面分享我在多个项目…...

ARMv8开发实战:Aarch64函数调用那些坑(含AAPCS64避坑指南)

ARMv8开发实战&#xff1a;Aarch64函数调用那些坑&#xff08;含AAPCS64避坑指南&#xff09; 在嵌入式开发和系统编程领域&#xff0c;ARMv8架构因其出色的能效比和性能表现&#xff0c;已经成为移动设备、服务器甚至超级计算机的主流选择。然而&#xff0c;当开发者从x86平台…...

告别标注烦恼:用DINOv2自监督模型,在Intel Image数据集上3个epoch实现93%准确率

零标注成本实战&#xff1a;DINOv2自监督模型在Intel Image数据集上的高效迁移方案 当我在实验室第一次尝试用传统方法训练一个图像分类模型时&#xff0c;面对数千张需要手动标注的图片&#xff0c;几乎要放弃这个课题。直到发现了自监督学习这个宝藏领域——特别是DINOv2这样…...