GUI(图形界面编程)

article/2025/9/23 13:43:05

(1)GUI 与CLI

     GUI

          •Graphical User Interface(图形用户接口)。

          •用图形的方式,来显示计算机操作的界面,这样更方便更直观。

    CLI

          •Command line User Interface (命令行用户接口)

          •就是常见的Dos命令行操作。

          •需要记忆一些常用的命令,操作不直观。

      
    (2)相关的两个包:        

     java.awt

           Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。

     javax.swing

          在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
  

   (3)GUI的继承体系
        组件:组件就是对象
            容器组件:是可以存储基本组件和容器组件的组件。
            基本组件:是可以使用的组件,但是必须依赖容器。

   
    (4)事件监听机制
        事件源:事件发生的地方

        事件:就是要发生的事情

        事件处理:就是针对发生的事情做出的处理方案

        事件监听器:就是把事件源和事件关联起来
    (5)适配器模式
        接口
        抽象适配器类
        实现类
    (6)案例:
        A:创建窗体案例

public class FrameDemo {public static void main(String[] args) {// 创建窗体对象// Frame f = new Frame();// Frame(String title)Frame f = new Frame("林青霞");// 设置窗体标题f.setTitle("HelloWorld");// 设置窗体大小f.setSize(400, 300); // 单位:像素// 设置窗体位置f.setLocation(400, 200);// 一个方法搞定//f.setBounds(400, 200, 400, 300);// 调用一个方法,设置让窗体可见f.setVisible(true);// System.out.println("helloworld");}
}


        B:窗体关闭案例

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;public class FrameDemo {public static void main(String[] args) {// 创建窗体对象Frame f = new Frame("窗体关闭案例");// 设置窗体属性f.setBounds(400, 200, 400, 300);// 让窗体关闭//事件源//事件:对窗体的处理//事件处理:关闭窗口(System.exit(0));//事件监听
//		f.addWindowListener(new WindowListener() {
//			@Override
//			public void windowOpened(WindowEvent e) {
//			}
//			
//			@Override
//			public void windowIconified(WindowEvent e) {
//			}
//			
//			@Override
//			public void windowDeiconified(WindowEvent e) {
//			}
//			
//			@Override
//			public void windowDeactivated(WindowEvent e) {
//			}
//			
//			@Override
//			public void windowClosing(WindowEvent e) {
//				System.exit(0);
//			}
//			
//			@Override
//			public void windowClosed(WindowEvent e) {
//			}
//			
//			@Override
//			public void windowActivated(WindowEvent e) {
//			}
//		});//用适配器类改进f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});// 设置窗体可见f.setVisible(true);}
}


        C:窗体添加按钮并对按钮添加事件案例。

/** 针对用户操作的四种功能*/
public interface UserDao {public abstract void add();public abstract void delete();public abstract void update();public abstract void find();
}
public class UserDaoImpl implements UserDao {@Overridepublic void add() {System.out.println("添加功能");}@Overridepublic void delete() {System.out.println("删除功能");}@Overridepublic void update() {System.out.println("修改功能");}@Overridepublic void find() {System.out.println("查找功能");}}

 /*
 * 问题:
 *         接口(方法比较多) -- 实现类(仅仅使用一个,也得把其他的实现给提供了,哪怕是空实现)
 *         太麻烦了,
 * 解决方案:
 *         接口(方法比较多) -- 适配器类(实现接口,仅仅空实现) -- 实现类(用哪个重写哪个)
 */

 

public abstract class UserAdapter implements UserDao {@Overridepublic void add() {}@Overridepublic void delete() {}@Overridepublic void update() {}@Overridepublic void find() {}}
public class UserDaoImpl2 extends UserAdapter {@Overridepublic void add() {System.out.println("添加功能");}
}

 


public class UserDaoDemo {public static void main(String[] args) {UserDao ud = new UserDaoImpl();ud.add();// 我没有说我们需要四种功能都实现啊。UserDao ud2 = new UserDaoImpl2();ud2.add();}
}


            界面中的组件布局。

public class FrameDemo {public static void main(String[] args) {// 创建窗体对象Frame f = new Frame("添加按钮");// 设置属性f.setBounds(400, 200, 400, 300);// 设置布局为流式布局f.setLayout(new FlowLayout());// 创建按钮对象Button bu = new Button("点我啊");// bu.setSize(20, 10);// 把按钮添加到窗体f.add(bu);// 设置窗体可以关闭f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});bu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("你再点试试");}});// 窗体显示f.setVisible(true);}
}


        D:把文本框里面的数据转移到文本域

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class FrameDemo {public static void main(String[] args) {// 创建窗体对象Frame f = new Frame("数据转移");// 设置窗体属性和布局f.setBounds(400, 200, 400, 300);f.setLayout(new FlowLayout());// 创建文本框final TextField tf = new TextField(20);// 创建按钮Button bu = new Button("数据转移");// 创建文本域final TextArea ta = new TextArea(10, 40);// 把组件添加到窗体f.add(tf);f.add(bu);f.add(ta);// 设置窗体关闭f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});// 对按钮添加事件bu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 获取文本框的值String tf_str = tf.getText().trim();// 清空数据tf.setText("");// 设置给文本域// ta.setText(tf_str);// 追加和换行ta.append(tf_str + "\r\n");//获取光标tf.requestFocus();}});// 设置窗体显示f.setVisible(true);}
}


        E:更改背景色

import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class FrameDemo {public static void main(String[] args) {// 创建窗体对象final Frame f = new Frame("更改背景色");// 设置窗体属性和布局f.setBounds(400, 200, 400, 300);f.setLayout(new FlowLayout());// 创建四个按钮Button redButton = new Button("红色");Button greenButton = new Button("绿色");Button buleButton = new Button("蓝色");// 添加按钮f.add(redButton);f.add(greenButton);f.add(buleButton);// 设置窗体关闭f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});// 对按钮添加动作事件// redButton.addActionListener(new ActionListener() {// @Override// public void actionPerformed(ActionEvent e) {// f.setBackground(Color.RED);// }// });// 对按钮添加鼠标点击事件// redButton.addMouseListener(new MouseAdapter() {// @Override// public void mouseClicked(MouseEvent e) {// f.setBackground(Color.RED);// }// });// 对按钮添加鼠标的进入事件redButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {f.setBackground(Color.RED);}});redButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseExited(MouseEvent e) {f.setBackground(Color.WHITE);}});greenButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {f.setBackground(Color.GREEN);}});greenButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseExited(MouseEvent e) {f.setBackground(Color.WHITE);}});buleButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {f.setBackground(Color.BLUE);}});buleButton.addMouseListener(new MouseAdapter() {@Overridepublic void mouseExited(MouseEvent e) {f.setBackground(Color.WHITE);}});// 设置窗体显示f.setVisible(true);}
}


        F:设置文本框里面不能输入非数字字符

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/** 你输入的如果是非数字字符,就取消你键盘录入的效果。*/
public class FrameDemo {public static void main(String[] args) {// 创建窗体对象并设置属性Frame f = new Frame("不能输入非数字字符");f.setBounds(400, 200, 400, 300);f.setLayout(new FlowLayout());// 创建Label标签对象Label label = new Label("请输入你的QQ号码,不能是非数字,不信你试试");TextField tf = new TextField(40);// 添加到窗体上f.add(label);f.add(tf);// 设置窗体关闭f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});// 给文本框添加事件tf.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {// 如果你取得的字符不是数字字符就取消事件// 思路:先获取字符,判断字符,取消事件// char getKeyChar()  char ch = e.getKeyChar();
//				System.out.println(ch);if(!(ch>='0' && ch<='9')){e.consume();}}});// 设置窗体可见f.setVisible(true);}
}


        G:一级菜单

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/** 一级菜单*/
public class FrameDemo {public static void main(String[] args) {// 创建窗体对象并设置属性Frame f = new Frame("一级菜单");f.setBounds(400, 200, 400, 300);f.setLayout(new FlowLayout());// 创建菜单栏MenuBar mb = new MenuBar();// 创建菜单Menu m = new Menu("文件");// 创建菜单项MenuItem mi = new MenuItem("退出系统");// 谁添加谁呢m.add(mi);mb.add(m);// 设置菜单栏f.setMenuBar(mb);// 设置窗体关闭f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});mi.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.exit(0);}});// 设置窗体可见f.setVisible(true);}
}


        H:多级菜单

import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;/** 多级菜单*/
public class FrameDemo {public static void main(String[] args) {// 创建窗体对象并设置属性final Frame f = new Frame("多级菜单");f.setBounds(400, 200, 400, 300);f.setLayout(new FlowLayout());final String name = f.getTitle();// 创建菜单栏MenuBar mb = new MenuBar();// 创建菜单Menu m1 = new Menu("文件");Menu m2 = new Menu("更改名称");// 创建菜单项final MenuItem mi1 = new MenuItem("好好学习");final MenuItem mi2 = new MenuItem("天天向上");MenuItem mi3 = new MenuItem("恢复标题");MenuItem mi4 = new MenuItem("打开记事本");MenuItem mi5 = new MenuItem("退出系统");// 谁添加谁呢m2.add(mi1);m2.add(mi2);m2.add(mi3);m1.add(m2);m1.add(mi4);m1.add(mi5);mb.add(m1);// 设置菜单栏f.setMenuBar(mb);// 设置窗体关闭f.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});mi1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {f.setTitle(mi1.getLabel());}});mi2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {f.setTitle(mi2.getLabel());}});mi3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {f.setTitle(name);}});mi4.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Runtime r = Runtime.getRuntime();try {r.exec("notepad");} catch (IOException e1) {e1.printStackTrace();}}});mi5.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.exit(0);}});// 设置窗体可见f.setVisible(true);}
}

 


http://chatgpt.dhexx.cn/article/hVltdrID.shtml

相关文章

GUI概述

GUI简介 GUI&#xff08;Graphics User Interface&#xff09;&#xff0c;中文名称为图形用户界面&#xff0c;是指采用图形方式显示的计算机操作用户界面&#xff0c;是计算机与其使用者之间的对话接口&#xff0c;是计算机系统的重要组成部分。 早期&#xff0c;电脑向用户提…

GUI(图形用户界面)

GUI全称是Graphical User Interface &#xff0c;即图形用户界面。GUI就是可以让用户直接操作的图形界面&#xff0c;包括窗口、菜单、按钮、工具栏和其他各种图形界面元素。 1.Swing概述 Swing是Java语言开发图形化界面的一个工具包。它以抽象窗口工具包&#xff08;AWT&…

虚拟存储技术

一.实现内存扩充的技术&#xff1a; &#xff08;1&#xff09;覆盖技术&#xff1a; 在程序运行中&#xff0c;在不同时刻把同一个存储区分配给不同程序段和数据段&#xff0c;实现存储区共享。适用于连续存储&#xff08;单一连续区分配&#xff0c;分区&#xff09; 如图B…

浅谈进程地址空间与虚拟存储空间

早期的内存分配机制 在早期的计算机中&#xff0c;要运行一个程序&#xff0c;会把这些程序全都装入内存&#xff0c;程序都是直接运行在内存上的&#xff0c;也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时&#xff0c;必须保证这些程序用…

虚拟存储器系统

技术来源 来源1&#xff1a;来源于服务器中虚拟化feature的实现&#xff0c;不同的程序需要共享一片硬件资源&#xff0c;包括计算资源与存储资源&#xff1b;如何有效且安全的共享存储器就是关键。来源2&#xff1a;消除有限的主存容量对大的程序的限制。远古时代&#xff0c…

虚拟存储器/虚拟内存

器为每个程序提供了一个大的、一致的、私有地址空间。 三个重要功能&#xff1a; 将主存看成是磁盘的高速缓存&#xff0c;在主存中只保存活动区域&#xff0c;并根据需要在磁盘和主存之间来回传送数据。为每个进程提供了一致的私有空间。保护每个进程的地址空间不被其他进程破…

5.虚拟存储管理

虚拟存储管理 文章目录 虚拟存储管理1.虚拟存储器概述1.1常规存储管理方式的特征和局部性原理1.2虚拟存储器的定义与特征1.3虚拟存储器的实现方法 2.请求分页存储管理方式2.1请求分页存储管理方式基本思想2.2请求分页中的硬件支持2.3内存分配策略和分配算法2.4调页策略 3.页面置…

(五)虚拟存储概念

1.需求背景 计算机系统内存空间不够用。 2.覆盖和交换 覆盖技术&#xff1a;把程序划分成功能独立的模块&#xff0c;将不会同时执行的模块共享同一块内存区域。 缺点&#xff1a;编程困难&#xff0c;增加了执行时间 交换技术&#xff1a;增加正在运行或需要运行的程序的内…

存储虚拟化技术的介绍

导读Java虚拟机内存的各个区域&#xff0c;以及这些区域的作用、服务对象以及其中可能产生的问题&#xff0c;作为大家的面试宝典。那一起来学习—存储虚拟化技术。 数据在整个计算机系统是最重要的一部分&#xff0c;也是最珍贵的。数据的存储一直是一个热议的话题&#xff0c…

进程地址空间与虚拟存储空间的理解

在进入正题前先来谈谈操作系统内存管理机制的发展历程&#xff0c;了解这些有利于我们更好的理解目前操作系统的内存管理机制。 一 早期的内存分配机制 在 早期的计算机中&#xff0c;要运行一个程序&#xff0c;会把这些程序全都装入内存&#xff0c;程序都是直接运行…

虚拟存储管理仿真

实验内容 模拟请求分页虚拟存储管理技术中的硬件地址变换、缺页中断及页式淘汰算法处理缺页中断 实验目的 为了使大的作业(其地址空间超过内存可用空间)或多个作业的地址空间之和超过实际主存空间时,仍能运行,引入了”虚拟存储器”的概念.使作业的一部分地址空间在主存,另一…

虚拟内存空间

每一个进程都会对应一个虚拟地址空间&#xff0c;32位操作系统会为每个进程分配4G&#xff08;2的32次方&#xff09;的虚拟地址空间&#xff0c;而MMU&#xff08;Memory Management Unit&#xff0c;内存管理单元&#xff09;负责把这4G虚拟内存映射到实际的物理内存中。这4G…

虚拟化存储和非虚拟化存储

有文件系统的叫虚拟化存储,没有文件系统的叫非虚拟化存储。. 虚拟化存储:由SAN 或 NAS 提供的存储空间,需要添加一层文件系统来屏蔽底层的差异性,性能较差。支持更多的虚拟化特性。 非虚拟化存储:由分布式存储提供的存储空间,没有添加文件系统,性能好,但无法支持高级特…

内存管理:虚拟存储

内存管理——虚拟存储器 目录 内存管理——虚拟存储器虚拟存储器概述常规存储管理方式的特征和局部性原理虚拟存储的定义和特征虚拟存储器的实现方法1.分页请求系统2.请求分段系统 请求分页存储管理方式请求分页中的硬件支持1.请求页表机制2.缺页中断机构3.地址变换机构 请求分…

存储系统 —— 虚拟存储器

本文主要介绍以下几方面的知识&#xff1a; 页式存储器&#xff08;应用于虚拟存储器&#xff09;虚拟存储器&#xff08;深刻理解&#xff09; 1.页式存储器 注&#xff1a; 虚拟地址或虚拟存储器的理解&#xff0c;请参考下文 虚拟存储器 的介绍 页式存储虚地址 VS 实地址 地…

存储虚拟化概述

存储虚拟化概述 一、基本概念 存储虚拟化(Storage Virtualization)最通俗的理解就是对存储硬件资源进行抽象化表现。典型的虚拟化包括如下一些情况&#xff1a;屏蔽系统的复杂性&#xff0c;增加或集成新的功能&#xff0c;仿真、整合或分解现有的服务功能等。虚拟化是作用在一…

虚拟化存储技术

文章目录 前言一、HCLA存储技术趋势与智能存储组件1、HCLA存储技术趋势&#xff08;1&#xff09;、什么是数据存储&#xff08;2&#xff09;、数据存储系统&#xff08;3&#xff09;、数据分类&#xff08;4&#xff09;、数据存储发展趋势小结 2、智能存储组件控制框硬盘框…

【KALI网络安全】DNS攻击(劫持和欺骗)与网络钓鱼的模拟和预防(1)

1、DNS概述 关于DNS的定义&#xff0c;作用&#xff0c;分类以及工作原理&#xff0c;博主已在【Windows Server 2019】DNS服务器的配置与管理——理论】这篇博客中陈述过。 要预防DNS劫持&#xff0c;必须了解它的攻击原理和过程 声明 本博客不是在向大家展示这些攻击的方法…

DNS 欺骗攻击基于ettercap

开启Apache服务器如下图所示 在/var/www/html文件夹下找到index.html 文件用自己新建的文件替换。此为自己新建主页 查看默认主页 本次实验使用kali (192.168.1.88/24) 以及win7系统虚拟机&#xff08;192.168.1.133/24&#xff09; Win7 IP Kali ip 查看ettercap 使用命…

DNS欺骗攻击、DDoS攻击、XSS攻击和SYN Flooding攻击

DNS欺骗攻击 攻击者冒充域名服务器&#xff0c;向目标主机提供错误的DNS信息&#xff0c;当用户尝试浏览网页&#xff0c;输入域名访问某网页&#xff0c;但实际上访问到的IP地址并不是该网页的IP地址&#xff0c;而是攻击者准备的网页的IP地址&#xff0c;所以用户在网页中提…