GUI-图形化的用户界面

news2025/1/18 7:35:20

一、概述 

所谓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{
        //重写事件处理方法
        @Override
        public 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() {
            @Override
            public void actionPerformed(ActionEvent e) {
                p.setBackground(Color.red);
            }
        });
        bG.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                p.setBackground(Color.GREEN);
            }
        });
        by.addActionListener(new ActionListener() {
            @Override
            public 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() {
            @Override
            public 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{
        @Override
        public void mouseEntered(MouseEvent e) {
            b.setText("鼠标已进入本按钮"+(++count)+"次");
        }
    }*/
    public static void main(String[] args) {
        new demo3();
    }
}

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

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

相关文章

【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统

特色功能: 智能定位与路线规划:UU跑腿小程序能够利用定位技术,为用户提供附近的跑腿服务,并自动规划最佳路线,提高配送效率。订单管理:包括订单查询、订单状态更新、订单评价等功能,全行业覆盖…

Excel Module: Iteration #1 EasyExcel生成下拉列表模版时传入动态参数查询下拉数据

系列文章 EasyExcel生成带下拉列表或多级级联列表的Excel模版自定义校验导入数据(修订) 目录 系列文章前言仓库一、实现1.1 下拉元数据对象1.2 构建下拉元数据的映射关系1.3 框架方式1.3.1 框架实现1.3.2 框架用例模版类加载下拉业务导出接口 1.4 EasyExcel方式1.4.1 EasyExce…

ESP8266基础资源了解

封装的硬件资源 参考1,参考2 常说的esp8266指的是有一个屏蔽罩盖着的模块,里面包含了esp8266芯片和一个能够存储数据和程序的flash,因为esp8266没有存储功能。 使用arduino常用的nodemcu是包含这个模块并含有电源LDO和串口下载的设计电路如…

【知识碎片】2024_05_09

本篇记录了关于C语言的一些题目(puts,printf函数的返回值,getchar,跳出多重循环),和一道关于位运算的代码[整数转换]。 C语言碎片知识 如下程序的功能是( ) #…

原来pip是有默认路径的。

今天一直报错: bash: /root/data1/anaconda3/envs/li_3_10/bin/pip: /root/lsc/anaconda3/envs/li_3_10/bin/python: bad interpreter: No such file or directory 原来是root/data1/anaconda3/envs/li_3_10/bin/pip: 这个位置的pip 自身带默认路径,然…

使用css的box-reflect属性制作倒影效果

box-reflect 是一个在 CSS 中创建元素倒影效果的非标准属性。尽管它在过去的一些 WebKit 浏览器中(如旧版的 Safari 和 Chrome)得到了支持,但由于它并未成为 CSS 标准的一部分,因此在现代浏览器中的兼容性较差。以下是对 box-refl…

C++ | Leetcode C++题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int n nums.size();if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slo…

03-Fortran基础--Fortran函数和子程序

03-Fortran基础--Fortran函数和子程序 0 引言1 各函数介绍1.1 函数&#xff08;Functions&#xff09;1.2. 子程序&#xff08;Subroutines&#xff09;1.3 递归函数&#xff08;Recursive Functions&#xff09;1.4. 泛型函数&#xff08;Generic Functions&#xff09;1.5. P…

blender 制作圆角立方体模型,倒角实现。cocos 使用。导出fbx

图片&#xff1a; 步骤&#xff1a; 1.首先创建一个立方体&#xff0c;这里可以使用默认的立方体。 2.在属性面板选择如“扳手”图标一样的修改器工具。 3.设置数量和段数实现圆角的圆滑效果&#xff0c;没有菱角。 保存导出相关的教程&#xff1a;

短信平台群发服务有什么优点

短信平台群发服务有什么优点 提高营销效率 短信平台群发服务利用自动化技术&#xff0c;可以帮助企业迅速向大量潜在客户营销信息。相比传统的逐一方式&#xff0c;群发服务可以同时大批目标客户&#xff0c;大大提高了营销效率。企业可以轻松地在短时间内覆盖更多的潜在客户&…

开源免费的定时任务管理系统:Gocron

Gocron&#xff1a;精准调度未来&#xff0c;你的全能定时任务管理工具&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Gocron是github上一个开源免费的定时任务管理系统。它使用Go语言开发&#xff0c;是一个轻量级定时任务集中调度和管理系统&#xff0c;用于替代L…

Python 2.x与Python 3.x:初学者该如何选择?

自从Python在1994年首次发布以来,已经经历了多个版本的更新和改进。Python 1.x虽然在发展史上具有重要意义,但早已过时,不再用于实际开发。2000年发布的Python 2.x和2008年发布的Python 3.x则成为了Python家族中最常用的两个版本,形成了一个重要的分界线。特别是Python 3.x…

FPGA+HDMI转换方案,用于网络直播切换直播画面,客户应用:直播,自媒体

FPGAHDMI转换方案&#xff0c;用于网络直播切换直播画面 客户应用:直播&#xff0c;自媒体 主要功能: 1.支持多路HDMI高清输入/输出 2.支持各路输入输出灵活切换 3.支持USB接口 4.支持网口 5.支持音频输出接口 6.支持serders

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&…

【SRC实战】利用APP前端加密构造数据包

挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合” 01 — 漏洞证明 “ 参数加密的情况&#xff0c;不会逆向怎么办&#xff1f;” 1、新用户首次设置密码时抓包&#xff0c;此处设置为0000…

【最大公约数 唯一分解定理 调和级数】2862. 完全子集的最大元素和

本文涉及知识点 质数、最大公约数、菲蜀定理 组合数学汇总 唯一分解定理 调和级数 LeetCode2862. 完全子集的最大元素和 给你一个下标从 1 开始、由 n 个整数组成的数组。你需要从 nums 选择一个 完全集&#xff0c;其中每对元素下标的乘积都是一个 完全平方数&#xff0c;例…

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-06-大型网站系统架构演化实例

文章目录 第一阶段&#xff1a;单体架构第二阶段&#xff1a;垂直架构第三阶段&#xff1a;使用缓存改善网站性能第四阶段&#xff1a;使用服务集群改善网站并发处理能力第五阶段&#xff1a;数据库读写分离第六阶段&#xff1a;使用反向代理和CDN加速网站响应第七阶段&#xf…

Java | Leetcode Java题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return sl…

Sarcasm detection论文解析 |基于语义知识和辅助信息增强讽刺检测方法

论文地址 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0306457322000139?via%3Dihub 论文首页 笔记框架 基于语义知识和辅助信息增强讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Information Processing & Managem…

CTF-Web Exploitation(持续更新)

CTF-Web Exploitation 1. GET aHEAD Find the flag being held on this server to get ahead of the competition Hints Check out tools like Burpsuite to modify your requests and look at the responses 根据提示使用不同的请求方式得到response可能会得到结果 使用…