GUI-图形化的用户界面

一、概述 

所谓GUI,即图形化的用户界面/接口(Graphical User Interface),实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面:

为了不被落下,Java依旧稳定发挥,它也提供了一套可以轻松构建GUI的工具,将GUI界面封装为类,其中若干类放在了java.awt包和javax.swing包内:

java.awt

(抽象窗口工具包)

依赖于本地操作系统的GUI,缺乏平台独立性,属重量级控件

包中主要包括界面组件、布局管理器、事件处理模型及图形和图像工具...

java.swing

完全由java实现,增强了可移植性,属轻量级控件;

在AWT的基础上建立的一套图形化界面系统,提供了更多的组件;

Swing中的类是从AWT继承的,有些Swing类直接扩展AWT中对应的类(JFrame、JPanel、JButton)

   

还去查了下swing是啥的缩写啥意思,来源...查到一个比较可信比较满意的结果,没啥意思..:

Swing和AWT之间的最明显的区别是界面组件的外观:一个基于Swing的应用程序可能在任何平台上都一样;而AWT依赖于本地操作系统在不同平台上运行相同的程序,界面的外观和风格可能会有一些差异

二、编程步骤

1、创建容器

Java容器(Container)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其他组件和容器的功能

分类

顶层容器:

  • JFrame(框架窗口)
  • JDialog(对话框)
  • JApplet(嵌入在网页中的Java小程序)

中间容器:

  • JPanel:最常用灵活
  • JScrollPane:可在大的组件或可扩展组件周围提供滚动条
  • JTabbedPane:包含多个组件,但一次只显示一个组件,用户可在组件之间方便的切换
  • JToolBar:换行或排列一组组件(通常是按钮)

下面我们都以顶层容器为JFrame(框架窗口)为例来讲解GUI的应用

框架窗口JFrame

Swing组件的顶层容器,继承了AWT的Frame类,支持Swing体系结构的高级GUI属性

常用构造方法:JFrame()、JFrame(String title)

常用方法:

setLocation(int x,int y)位置

setLocationRelativeTo(null)

居中
setSize(int x,int y)大小

setResizable(true)

可调整大小

setVisible(true)

可视化窗口(必须要有)
setContentPane(Container contentPane)、getContentPane()设置/返回此窗体的 contentPane 对象
setLayout(LayoutManager manager)设置LayoutManager属性 
setDefaultCloseOperation(int operation)、getDefaultCloseOperation()设置/返回用户在此窗体上单击“关闭”按钮时默认执行的操作
setIconImage(Image image)窗口图标显示的图
setMenuBar(JMenuBar menubar)设置窗口的菜单栏

创建一个简单的空窗口:

 在早期的java版本中,对JFrame添加组件有两种方式:

  •  用getContentPane()方法获得JFrame的内容面板rootpanel,再对其加入组件:
    f.getContentPane().add(childComponent)
  • 建立一个中间容器p,把该容器置为JFrame的内容面板,再对其加入组件:
    JPanel p=new JPanel();//创建中间面板
    .....//把其它组件添加到中间容器中
    f.setContentPane(p);//把中间容器p对象设置成为frame的内容面板

这时候还是不可以直接往JFrame内直接添加组件的,否则会抛出异常,因为JFrame 不是一个容器,它只是一个框架!

ContentPane是一个Swing容器类,它是Frame、JDialog和JApplet的默认容器,用于承载和管理其他GUI组件,以构建窗口界面。在创建JFrame就会自动创建了ContentPane,getContentPane()获取其默认对象对象。

但是大人现在时代不同了!已经简化为可以直接向JFrame添加组件了,实际上还是向内容面板进行了添加,只是代码上简洁了

frame.add(child);

可以通过阅读java源代码得知:

但是我们在对JFrame设置背景颜色后界面仍是白色的,原因很简单,创建JFrame时自动生成的rootpanel覆盖在JFrame之上,即便对JFrame设置背景色,白色的rootpanel覆盖上去又是白的了,l所以要么对rootpanel设置背景色,要么添加个you'yan

中间容器JPane

常用构造方法:JPanel(),JPanel(LayoutManager layout)

常用方法:

void add(Component comp)在容器中添加指定的组件
void remove(Component comp)从容器中移除指定的组件
void setFont(Font f)设置容器的字体
void setBackground(Color c)设置组件的背景色

JFrame与JPanel的区别
  • JFrame可以独立存在、可被移动、可被最大化和最小化;有标题栏、边框,可添加菜单栏;默认布局BorderLayout(边界布局)
  • JPanel不能独立运行,必须包含在另一个容器中;没有标题、边框,不可添加菜单栏;默认布局FlowLayout(流式布局)

2、添加组件

添加组件用于和用户交互 (Java图形用户界面的最基本组成部分)

基本组件
组件构造方法(举例参数最全的一个)常用方法

标签组件 JLabel()

显示单行文本信息的组件,一般用来显示固定的提示信息

JLabel(String text,Icon image,int honrizontalAlignment)

水平对齐方式取值:JLabelLEFT、JLabelRIGHT、JLabelCENTER

setText(String text)

getText()

setIcon(Icon image)

getIcon()

按钮组件 JButton

最简单的按钮组件,只在按下和释放两个状态之间进行切换

JButton(String text、Icon image)

setText(String text)

setMargin(Insets m)

setEnable(boolean flag) setHorizontalAlignment(int align) setVerticalAlignment(int alig)

文本框JTextFiled

JTextFiled(String text,int columns)setColumns(int columns) setFront(Font f) setHorizontalAlignment(int alignment)
JTextArea文本区域JTextArea(String text,int rows,int columns)

append(String str)

setColuns(int columns)

getColumns()获取行数

getRows()

setLineWrap(boolean wrap)

另外还有JCeckBox复选框、JToggleButton开关按钮、JPassword密码框、JComboBox下拉列表框、JList列表、JProgressBar进度条、JSilder滑块,菜单组件(菜单栏JMenuBar、下拉菜单JMenu、菜单项JMenuIte)

3、安排组件

为了更好的实现跨平台,可以通过相对量衡量、布局管理器Layout Manager、相关属性进行设置

绝对定位

在Java中可以通过绝对定位的方式进行布局,运用绝对定位时需要注意以下几点:

JFrame的布局方式要设置为null  例如:

jframe.setLayout(null)

需要设置x坐标、y坐标,width组件宽度,height组件高度 例如

组件.setBounds(x,y,w,h) 

布局管理器Layout Manager

在使用Swing向容器添加组件时,需要考虑组件的位置和大小。如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加,这样虽然能够灵活控制组件的位置,实现却非常麻烦。

为了加快开发速度,Java提供了一些布局管理器,他们可以将组件进行统一管理,这样开发人员就不需要考虑组件是否会重叠等问题。有以下6种:

边框布局BorderLayout、流式布局FlowLayout、网格布局GirdLayout、卡片布局CardLayout、盒布局BoxLayout、空布局null(绝对定位时设置)

接下来把这几种布局管理器都演示一遍:

 

 

 

4、处理事件

相关概念

案例1:点击不同的按钮,面板改变响应背景颜色

  • 事件:点击(用户所执行的动作)
  • 事件源:按钮(动作发生的对象)
  • 事件处理:变色(当用户在某组件上执行某事件,则进行相应处理)
  • 监听器:时刻监听事件源上所有发生的事件类型,一旦该事件类型与自己所负责处理的事件                  类型一致,就马上进行处理
常用事件对应的监听器接口

事件类型( java.awt.event )

监听器接口监听器接口抽象方法
动作事件 ActionEventActionListeneractionPerfermed()
鼠标事件 MouseEventMouseListener

mouseClicked(MouseEvent e)

mousePressed(MouseEvent e)

mouseReleased(MouseEvent e)

mouseEntered(MouseEvent e)

mouseExited(MouseEvent e)

鼠标移动事件 MouseMotionEventMouseMotionListener

mouseDragged(MouseEvent e)
mouseMoved(MouseEvent e)

键盘事件 KeyEventKeyListener

keyTyped(KeyEvent e)

keyPressed(KeyEvent e)

keyReleased(KeyEvent e)

 下面来写一下上述案例代码:

使用内部类
public class demo1 extends JFrame{JPanel p;JButton jRed,jGreen,jYellow;public demo1(){super("事件测试-改变颜色");p=new JPanel();jRed=new JButton("红色");jGreen=new JButton("绿色");jYellow=new JButton("黄色");//2、创建一个监听器组件ButtonListener buttonListener=new ButtonListener();//3、注册监听jRed.addActionListener(buttonListener);jGreen.addActionListener(buttonListener);jYellow.addActionListener(buttonListener);p.add(jRed);p.add(jGreen);p.add(jYellow);this.add(p);this.setBounds(400,500,700,650);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}//1、创建扩展ActionListener的监听类/*该监听器类是一个内部类,外部类 可以直接对外部类中的资源进行访问*/class ButtonListener implements ActionListener{//重写事件处理方法@Overridepublic void actionPerformed(ActionEvent e) {//获取事件源并判断Object souce=e.getSource();if(souce==jRed){p.setBackground(Color.red);}else if(souce==jGreen){p.setBackground(Color.green);}else{p.setBackground(Color.yellow);}}}public static void main(String[] args) {new demo1();}}
直接使用匿名内部类 
public class demo2 extends JFrame{JPanel p;JButton bR,bG,by;public demo2(){super("匿名监听类实现");p=new JPanel();bR=new JButton("红");bG=new JButton("绿");by=new JButton("黄");//直接使用匿名监听类注册监听bR.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {p.setBackground(Color.red);}});bG.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {p.setBackground(Color.GREEN);}});by.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {p.setBackground(Color.yellow);}});p.add(bR);p.add(bG);p.add(by);this.add(p);this.setBounds(400,500,700,650);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public static void main(String[] args) {new demo2();}
}

案例2:创建一个窗口,在窗口中加入一个按钮组件,用适配器类实现:当鼠标进入按钮,则改变按钮文字内容,记录进入次数。

上面动作监听器的实现使用内部类或匿名内部类是比较方便的,,但是看一下鼠标监听器接口,若我只是要监听鼠标进入按钮,而不用监听其他鼠标事件,还要实现鼠标监听器接口全部抽象方法是不是太过分了呢?

适配器类

为了简化代码,JDK提供了对应的适配器类,该类是对应接口的实现类

  • MouseListener —> MouseAdapter
  • KeyListener —> KeyAapter
  • MouseMotionListener —>MouseMotionAdapter

 下面利用适配器类来写下案例2:

public class demo3 extends JFrame{JPanel p;JButton b;int count=0;public demo3(){p=new JPanel();b=new JButton("鼠标已进入本按钮"+count+"次");p.add(b);//b.addMouseListener(new myListener());b.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {b.setText("鼠标已进入本按钮"+(++count)+"次");}});this.add(p);this.setBounds(400,300,700,500);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}/*class myListener extends MouseAdapter{@Overridepublic void mouseEntered(MouseEvent e) {b.setText("鼠标已进入本按钮"+(++count)+"次");}}*/public static void main(String[] args) {new demo3();}
}

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

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

相关文章

WebRtc 视频通话,语音通话实现方案

先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素&#xff0c;用于显示本地视频 --><video ref"r…

基于Springboot的线上教学平台

基于SpringbootVue的线上教学平台设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 学习资料 交流论坛 试卷列表 公告信息 后台登录 后台首页 学员管理 资料类型…

实习报告怎么写?笔灵AI实习体验报告模版分享:AI产品前端实习生

实习报告怎么写&#xff1f;笔灵AI实习体验报告模版可以帮你 点击即可使用&#xff1a;https://ibiling.cn/scene/inex?fromcsdnsx 下面分享AI产品前端实习生的实习报告 尊敬的导师和领导们&#xff1a;首先&#xff0c;我想对你们表达我的诚挚感谢&#xff0c;感谢你们给我…

FPGA OSD 方案,应用于XBOX游戏机收费等领域

FPGA方案&#xff0c;HDMI IN接收原始HDMI 信号&#xff0c;HDMI OUT输出叠加字符/图片后的HDMI信号 客户应用&#xff1a;XBOX游戏机收费 主要特性&#xff1a; 1.支持多分辨率格式显示 2.支持OSD 叠加多个图层 3.支持字体大小随意配置 4.支持字体格式随意配置 5.零延时&…

多线程典型例子(4)——线程池

文章目录 一、线程池的基本情况1.1、使用线程池的必要性1.2、线程池为什么比直接在系统中创建线程更高效&#xff1f;1.2.1、纯内核态操作1.2.2、纯用户态操作 1.3、那为什么用户态操作比内核态操作更高效&#xff1f;二、如何在Java中使用线程池2.1、ExecutorService2.1、Thre…

OBS插件--自定义着色器

自定义着色器 自定义着色器是一个滤镜插件&#xff0c;可以用于源和场景。插件自带一百多款滤镜效果&#xff0c;支持自己编写效果代码。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在插件中心左侧导航栏&#xff0c;选择 滤镜 项&#xff0c;然…

【Linux】深浅睡眠状态超详解!!!

1.浅度睡眠状态【S】&#xff08;挂起&#xff09; ——S (sleeping)可中断睡眠状态 进程因等待某个条件&#xff08;如 I/O 完成、互斥锁释放或某个事件发生&#xff09;而无法继续执行。在这种情况下&#xff0c;进程会进入阻塞状态&#xff0c;在阻塞状态下&#xff0c;进程…

C++从入门到入土(二)——初步认识类与对象

目录 前言 类与对象的引入 类的定义 类的访问限定符及封装 访问限定符&#xff1a; 封装&#xff1a; 类的作用域 类的实例化 类的大小 this指针 this指针的特性 前言 各位佬们&#xff0c;在开始本篇文章的内容之前&#xff0c;我想先向大家道个歉&#xff0c;由于…

linux中进程相关概念(一)

什么是程序&#xff0c;什么是进程&#xff0c;有什么区别&#xff1f; 程序是静态的概念&#xff0c;当我们使用gcc xxx.c -o pro进行编译时&#xff0c;产生的pro文件&#xff0c;就是一个程序。 进程是程序的一次运行活动&#xff0c;通俗点就是说程序跑起来了就是进程。 …

利用智能私信软件,快速拓展潜在客户群体

在数字化营销的浪潮中&#xff0c;企业如何快速而有效地触及并吸引潜在客户&#xff0c;已成为一个不可忽视的挑战。随着人工智能技术的不断进步&#xff0c;智能私信软件作为一种新型工具&#xff0c;正逐渐改变着企业的市场拓展方式。本文将探讨如何通过这类软件&#xff0c;…

RBAC 权限设计(五)

序言 本文介绍 RBAC2 模型以及具体的实现方案。本文仅提供实现思路供大家参考&#xff0c;在生产实践中请根据业务场景进行具体设计。 一、RBAC2 模型 RBAC2 是 RBAC&#xff08;基于角色的访问控制&#xff09;模型中的一种&#xff0c;它在 RBAC0 的基础上&#xff0c;对用…

GitHub中Asterank源码python修改成C++(本人python不太会)

GitHub - typpo/asterank: asteroid database, interactive visualizations, and discovery tools 主要目的是在进行多元线性回归的时候将枚举型转换为数值型 python: # # The constants used in calculations for the values of asteroids. ## General constants GENERAL_I…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

引入OSS

前置条件 AccessKey 引入依赖 都是官网上的&#xff1a;https://help.aliyun.com/zh/oss/developer-reference/java-installation?spma2c4g.11186623.0.i16 <!--若是创建项目的时候这个依赖勾选了就不用了--><!--不加启动会报错No active profile set, falling back…

JavaScript之数据类型(2)——复杂类型(object)

object的介绍&#xff1a; 我对于object的理解是和C/C中的结构体一样&#xff0c;是一个自定义的数据类型&#xff0c;我们可以通过多个简单的数据类型来定义一个便于我们使用的新的数据类型。 在网上某佬对于其解释如下&#xff1a; Object类型&#xff0c;我们也称为一个对象…

Windows命令行一键安装、配置WSL的方法

本文介绍在Windows电脑中&#xff0c;通过命令行的方式&#xff0c;快速、方便安装适用于Linux的Windows子系统&#xff08;Windows Subsystem for Linux&#xff0c;WSL&#xff09;的方法。 WSL是由微软开发的一项功能&#xff0c;允许在Windows操作系统上运行Linux发行版系统…

【Linux的文件篇章 - 磁盘文件】

Linux学习笔记---012 Linux之进程程序替换理解1、磁盘文件1.1、文件如何存取的问题1.2、了解磁盘的存储结构1.3、如何找到指定位置的扇区&#xff1f;1.4、对磁盘的存储进行逻辑抽象(了解OS对磁盘这样的硬件设备的抽象与管理) 2、磁盘级文件系统2.1、Linux文件系统特定2.2、文件…

Ansible--Templates 模块 Tags模块 Roles模块

一 Templates 模块 ①Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件&#xff0c;可看作一个编译过的模 板文件&#xff0c;用来产生目标文本&#xff0c;传递Python的变量给模板去替换模板中的标记。 ②在配置文件中&#xff0c;会有一些数据&#xff08;如…

Java毕设之基于SpringBoot的在线拍卖系统

运行环境 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) 系统详细设计 管理员功能模块 管理员登录&#xff0c;管理员通过输入用户名、密码、角色等信…

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题&#xff1a; 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件&#xff0c;设置浮力点&#xff0c;应用水中牵引力。 4、最重要的是需要激活——自动启用。 5、调水波长的地方 双击图片…