GUI基础01

news/2025/2/26 16:52:52/文章来源:https://www.cnblogs.com/LyqStudyJava/p/18738951

GUI编程 graphics User iterface

1. 组件

  • 窗口
  • 弹窗
  • 面板
  • 文本框
  • 列表框
  • 按钮
  • 图片
  • 监听事件
  • 鼠标
  • 键盘事件
  • 破解工具

2. 简介

GUI核心技术: Swing 、 AWT

缺点:

  1. 界面不美观
  2. 需要jre环境

我们为什么要学习?

  1. 可以写出自己心中想要的一些小工具
  2. 工作的时候可以维护到Swing界面,但是概率很小,现在的公司不会做这些
  3. 了解MVC架构,了解监听!

1. AWT abstract windows tools

1、 AWT介绍

  1. 包含了很多类跟接口
  2. 元素:窗口、按钮、文本域
  3. java.awt包

AWT介绍

2、 组件和容器

1、Frame

package com.lesson01;import java.awt.*;public class TextFrame {public static void main(String[] args) {Frame frame = new Frame("我的第一个窗口");frame.setVisible(true);frame.setSize(100,100);frame.setBackground(new Color(100,100,100));frame.setLocation(200,200);frame.setResizable(false);}
}

2、对窗口的封装

package com.lesson01;import java.awt.*;public class TextFrame2 {public static void main(String[] args) {//展示多个窗口MyFrame myFrame = new MyFrame(100,100,200,200,Color.blue);MyFrame myFrame2 = new MyFrame(100,100,200,200,Color.blue);MyFrame myFrame3= new MyFrame(100,100,200,200,Color.blue);MyFrame myFrame4 = new MyFrame(100,100,200,200,Color.blue);MyFrame myFrame5 = new MyFrame(100,100,200,200,Color.blue);MyFrame myFrame6 = new MyFrame(100,100,200,200,Color.blue);}
}class MyFrame extends Frame {static int count = 0;public MyFrame(int x, int y,int width,int height,Color color) {super("MyFrame" + (++count));//继承父类后,父类中的方法直接可以用,不用再写对象名setBounds(x,y,width,height);setBackground(color);setResizable(false);setVisible(true);}}

3、面板Panel

解决了关闭事件

package com.lesson01;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;//panel可以看成一个空间,但是不能单独存在
public class TextPanel {public static void main(String[] args) {Frame frame = new Frame();Panel panel = new Panel();//设置布局frame.setLayout(null);frame.setBounds(100,100,200,200);frame.setBackground(new Color(100,100,100));//panel的坐标是相对于frame的panel.setBounds(50,50,50,50);panel.setBackground(new Color(2,1,3));//在窗口中加入面板frame.add(panel);frame.setVisible(true);//监听事件。设置窗口关闭事件, System.exit(0)//适配器模式frame.addWindowListener(new WindowAdapter() {//点击窗口的X号时需要做的事情@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

4、布局管理器

1、 流式布局管理器

package com.lesson01;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextFlowLayout {public static void main(String[] args) {Frame frame = new Frame();Button button01 = new Button("button1");Button button02 = new Button("button2");Button button03 = new Button("button3");frame.setBounds(100,100,200,200);//frame.setLayout(new FlowLayout());//frame.setLayout(new FlowLayout(FlowLayout.LEFT));frame.setLayout(new FlowLayout(FlowLayout.RIGHT));frame.setResizable(false);frame.add(button01);frame.add(button02);frame.add(button03);frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

2、边境布局 东西南北中

package com.lesson01;import com.OOP.demo07.B;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextBorderLayout {public static void main(String[] args) {Frame frame = new Frame("TextBorderLayout");Button east = new Button("east");Button west = new Button("west");Button south = new Button("south");Button north = new Button("north");Button center = new Button("center");frame.setBounds(500,500,500,500);frame.add(east,BorderLayout.EAST);frame.add(west,BorderLayout.WEST);frame.add(south,BorderLayout.SOUTH);frame.add(north,BorderLayout.NORTH);frame.add(center,BorderLayout.CENTER);frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

3、表格布局 Grid

package com.lesson01;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextGridLayout {public static void main(String[] args) {Frame frame = new Frame();Button button1 = new Button("1");Button button2 = new Button("2");Button button3 = new Button("3");Button button4 = new Button("4");Button button5 = new Button("5");Button button6 = new Button("6");frame.add(button1);frame.add(button2);frame.add(button3);frame.add(button4);frame.add(button5);frame.add(button6);frame.setBounds(100,100,600,600);frame.setLayout(new GridLayout(3,2));frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

4、ExampleDemo

5、总结

  1. Frame是一个顶级容器

  2. Panel无法单独显示,必须添加到某个容器中

  3. 布局管理器

    • 流式布局 FlowLayout
    • 边境布局 东西南北中 BorderLayout
    • 表格 GridLayout
  4. 属性:大小、定位、背景颜色、可见性、窗口大小可变、监听、适配器:Adaper...

5、事件监听

package com.lessen02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextActionEvent {public static void main(String[] args) {Frame frame = new Frame("TextActionListener");Button button = new Button("please click");MyActionListener myActionListener = new MyActionListener();//因为addActionListener()需要一个ActionListener,所以我们需要构造一个ActionListenerbutton.addActionListener(myActionListener);frame.add(button);frame.pack();windowClose(frame);frame.setVisible(true);}private static void windowClose(Frame frame) {frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}class MyActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("aaa");}
}
package com.lessen02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;//两个按钮实现一个监听public class TextActionTwo {public static void main(String[] args) {Frame frame = new Frame("开始-停止");Button button1 = new Button("start");Button button2 = new Button("stop" );//可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值//可以多个按钮只写一个监听类button1.setActionCommand("button1-start");button2.setActionCommand("button2-stop");MyMonitor myMonitor = new MyMonitor();button1.addActionListener(myMonitor);button2.addActionListener(myMonitor);frame.add(button1,BorderLayout.NORTH);frame.add(button2,BorderLayout.SOUTH);frame.setBounds(100,100,200,200);frame.setResizable(true);frame.pack();frame.setVisible(true);windowClose(frame);}private static void windowClose(Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}class MyMonitor implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//e.getActionCommand 获得按钮信息System.out.println("按钮被点击了:msg => " + e.getActionCommand());}
}

5.1、输入框TextField监听

package com.lessen02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TextText01 {public static void main(String[] args) {new MyFrame();}
}class MyFrame extends Frame {public MyFrame() {TextField textField = new TextField();add(textField);//监听这个文本框输入的文字MyActionListener02 myActionListener02 = new MyActionListener02();//按下Enter 就会触发这个输入框的事件textField.addActionListener(myActionListener02);//设置替换编码textField.setEchoChar('*');setVisible(true);pack();}}class MyActionListener02 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {TextField field = (TextField) e.getSource(); //获得一些资源,返回的一个对象System.out.println(field.getText()); //获得输入框中的文本field.setText(""); //回车清空输入框    }
}

5. 1、鼠标监听

目的:想要实现鼠标画画

鼠标监听画笔画画事件

package com.lesson03;import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;//鼠标监听事件
public class TextMouseListener {public static void main(String[] args) {new MyFrame("画图software");}
}//自己的类
class MyFrame extends Frame {//画画需要画笔,需要监听鼠标当前位置,需要一个集合来存储这个点ArrayList points;public MyFrame(String title) {super(title);setBounds(200,200,400,400);setVisible(true);//存鼠标点击的点points = new ArrayList();//鼠标监听器,针对这个窗口this.addMouseListener(new MyMouseListener());WindowClose(this);}@Overridepublic void paint(Graphics g) {Iterator iterator = points.iterator();while (iterator.hasNext()) {Point point = (Point) iterator.next();g.setColor(Color.blue);g.fillOval(point.x,point.y,10,10);}}//添加一个点到界面上public void addPaint(Point point){points.add(point);}//适配器模式private class MyMouseListener extends MouseAdapter {@Overridepublic void mousePressed(MouseEvent e) {MyFrame myFrame = (MyFrame) e.getSource();//点击的时候会在界面上产生一个点//这个点就是鼠标的点myFrame.addPaint(new Point(e.getX(),e.getY()));//每次点击鼠标都需要重新画一次myFrame.repaint();//刷新   帧率}}private void WindowClose(Frame frame) {frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

5.2、窗口监听

package com.lesson03;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextWindow {public static void main(String[] args) {new WindowFrame();}
}class WindowFrame extends Frame {public WindowFrame() {setBounds(200,200,400,400);setVisible(true);addWindowListener(new MyWindowListener());}class MyWindowListener extends WindowAdapter {@Overridepublic void windowClosing(WindowEvent e) {setVisible(false);  //通过按钮,隐藏当前窗口System.exit(0);//正常退出}}
}
package com.lesson03;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextWindow {public static void main(String[] args) {new WindowFrame();}
}class WindowFrame extends Frame {public WindowFrame() {setBounds(200,200,400,400);setVisible(true);addWindowListener(new MyWindowListener());}class MyWindowListener extends WindowAdapter {@Overridepublic void windowClosing(WindowEvent e) {setVisible(false);  //通过按钮,隐藏当前窗口System.exit(0);//正常退出}}
}

5.3、键盘监听

package com.lesson03;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextKeyListener {public static void main(String[] args) {new MyKeyFrame();}
}class MyKeyFrame extends Frame {public MyKeyFrame(){setBounds(1,2,300,500);setVisible(true);windowClose(this);this.addKeyListener(new KeyAdapter() {//键盘按下@Overridepublic void keyPressed(KeyEvent e) {//获得键盘按下的是哪一个键,通过当前的码值确定int keyCode = e.getKeyCode();	//不需要去记录这个数值,直接使用静态属性 VK_XXXSystem.out.println(keyCode);if (keyCode == KeyEvent.VK_UP) {System.out.println("↑");}}});}private void windowClose(Frame frame) {frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

练习:组合 + 内部类

oop原则:组合大于继承!

尽量不要使用继承与多态

继承会增加耦合性

多态会使代码变得复杂

1、原本使用继承方法下的代码

package com.lessen02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextCalculator {public static void main(String[] args) {new Calculator();}}
//计算器类
class Calculator extends Frame {public Calculator(){Frame frame = new Frame();//组建//三个文本框TextField number01 = new TextField(10);TextField number02 = new TextField(10);TextField number03 = new TextField(20);//一个按钮 计算器对等号进行监听Button button = new Button(" = ");button.addActionListener(new MyCalculatorListener(number01,number02,number03));//一个标签Label label = new Label(" + ");//布局frame.setLayout(new FlowLayout());frame.add(number01);frame.add(label);frame.add(number02);frame.add(button);frame.add(number03);frame.pack();frame.setVisible(true);windowClose(frame);}public static void windowClose (Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}//监听器类
class MyCalculatorListener implements ActionListener {private TextField number01,number02,number03;public MyCalculatorListener(TextField number01,TextField number02,TextField number03) {this.number01 = number01;this.number02 = number02;this.number03 = number03;}@Overridepublic void actionPerformed(ActionEvent e) {//1. 获得加数和被加数int i = Integer.parseInt(number01.getText());int j = Integer.parseInt(number02.getText());//2. 将这个值进行 +法运算后,放到第三个框number03.setText("" + (i + j));//3. 清除前两个框number01.setText("");number02.setText("");}
}

2、使用组合

package com.lessen02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextCalculator {public static void main(String[] args) {new Calculator().loadFrame();}}
//计算器类
class Calculator extends Frame {//属性TextField number01,number02,number03;//方法public void loadFrame(){Frame frame = new Frame();//组建number01 = new TextField(10);number02 = new TextField(10);number03 = new TextField(20);//一个按钮 计算器对等号进行监听Button button = new Button(" = ");Label label = new Label(" + ");button.addActionListener(new MyCalculatorListener(this));//布局frame.setLayout(new FlowLayout());frame.add(number01);frame.add(label);frame.add(number02);frame.add(button);frame.add(number03);frame.pack();frame.setVisible(true);windowClose(frame);}public static void windowClose (Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}//监听器类
class MyCalculatorListener implements ActionListener {//获得计算器这个对象,在一个类中组合另一个类Calculator calculator = null;public MyCalculatorListener(Calculator calculator) {this.calculator = calculator;}@Overridepublic void actionPerformed(ActionEvent e) {//1. 获得加数和被加数//2. 将这个值进行 +法运算后,放到第三个框//3. 清除前两个框int i = Integer.parseInt(calculator.number01.getText());int j = Integer.parseInt(calculator.number02.getText());calculator.number03.setText("" + (i + j));calculator.number01.setText("");calculator.number02.setText("");}
}

3、完全改造成面向对象写法 使用内部类方法

  • 内部类能更好的包装
package com.lessen02;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextCalculator {public static void main(String[] args) {new Calculator().loadFrame();}}
//计算器类
class Calculator extends Frame {//属性TextField number01,number02,number03;//方法public void loadFrame(){Frame frame = new Frame();//组建number01 = new TextField(10);number02 = new TextField(10);number03 = new TextField(20);//一个按钮 计算器对等号进行监听Button button = new Button(" = ");Label label = new Label(" + ");button.addActionListener(new MyCalculatorListener());//布局frame.setLayout(new FlowLayout());frame.add(number01);frame.add(label);frame.add(number02);frame.add(button);frame.add(number03);frame.pack();frame.setVisible(true);windowClose(frame);}//监听器类//内部类最大的好处,就是能畅通无阻的访问外部类的属性和方法!private class MyCalculatorListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//1. 获得加数和被加数//2. 将这个值进行 +法运算后,放到第三个框//3. 清除前两个框int i = Integer.parseInt(number01.getText());int j = Integer.parseInt(number02.getText());number03.setText("" + (i + j));number01.setText("");number02.setText("");}}public static void windowClose (Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

6. 画笔 paint

package com.lesson03;import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class TextPaint {public static void main(String[] args) {new MyPaint().loadFrame();}
}class MyPaint extends Frame {public void loadFrame() {Frame frame = new Frame();frame.setBounds(200,200,1000,1000);frame.setVisible(true);windowClose(frame);}//画笔@Overridepublic void paint(Graphics g) {g.setColor(Color.red);g.setColor(Color.black);g.drawOval(100,100,200,200);g.fillOval(400,400,200,200);//养成习惯,画笔用完,将他还原到最初的颜色}public static void windowClose(Frame frame) {frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});
}

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

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

相关文章

以下是使用:empty 搭配before实现表格中数据为空时的默认展示

以下是使用:empty 搭配before实现表格中数据为空时的默认展示// 在文件.vue中的table<template><!-- 省略其他代码 --><el-table-column prop="title" label="标题"></el-table-column><el-table-column prop="desc"…

07 常用优化器简介

模型能否准确地预测数据,是通过损失函数来衡量的。如何调整权重和偏差参数,从而最小化神经网络的损失函数,这是一类特定的优化算法。我们称它们为优化器(optimizer)。 为什么需要优化器? 因为损失函数参数众多且结构复杂,其导数置零的方程无法得到解析解或计算非常复杂。…

github-emoji-list

Github-emoji-list转载自https://github.com/caiyongji/emoji-list。emoji-list具体效果如下所示。人物:bowtie: :bowtie: 😄 :smile: 😆 :laughing:😊 :blush: 😃 :smiley: ☺️ :relaxed:😏 :smirk: 😍 :heart_eyes: 😘 :kissing_heart:😚 :kissing_closed_e…

2024年我读过的10本技术书籍(Java、架构、SRE运维)

什么是一本好书? 首先,我们需要定义什么是一本有价值的书籍。个人认为,一本好书应该具备以下特点:它能让我理解其中的一半+内容,引发共鸣,而剩下的部分内容则需要我反复阅读才能逐渐领会。如果我读完后发现完全理解了,那么这本书对我来说意义不大,因为它没有挑战我的思…

如何在WEB前端页面嵌入桌面程序EXE运行窗口?

在数字化转型浪潮中,企业常面临WEB与本地桌面应用割裂的痛点:‌复杂文档编辑需频繁切换系统,专属行业软件无法融入B/S架构‌……如何在WEB页面中直接调用并嵌入EXE程序窗口,实现真正的“云端+本地”一体化体验?猿大师中间件自从2019年发布以来,已经发布了三个重要产品:猿…

探索2025年客户管理新方向,看这家企业如何成功落地

某企业近年来销售业绩一直停滞不前,尽管产品质量过硬,企业的销售业绩却始终未能实现预期的突破。企业内部对销售策略进行了深入分析,发现销售业绩不佳的主要原因在于重复购买率低。 在管理层进一步分析后,发现是企业的销售和市场推广手段过于单一,缺乏有效的客户留存策略。…

使用Git拉取项目并对idea,vs-code配置(图解)

方法一:在线拉取(直接拉取到本地文档,后面还有一个IDEA直接在线拉取)在gitee中找到自己要拉取的项目,点击克隆/下载 对下图标红的命令复制打开你的文档,这个文件夹(名称不为中文)自己选择(想把项目保存到哪里看自己),我这里随便新建了一个文件夹。 注意:在这…

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

ReAct:结合推理(COT)和行动(动作生成)。 ReAct主要内容将COT方法与ACT方法结合起来,引入了 ReAct,这是一种新的基于提示的范式,旨在将推理和行动在语言模型中协同起来,以解决通用任务。 展示了在少样本学习设置中,ReAct 相较于仅进行推理或动作生成的先前方法的优势。…

数字孪生城市:北斗网格码破解地下管网难题!

城市地下管网如同人体的“血管”和“神经”,承载着供水、供电、燃气、通信等核心功能。然而,传统管理模式长期面临“看不见、摸不着、管不好”的困境:施工误挖、管线老化、信息孤岛等问题频发,每年因管网事故造成的经济损失高达数百亿元。如何破解这一难题?北斗网格码技术…

供应链管理系统--升鲜宝收银系统功能解析,登录、主界面UI 设计图(一)

供应链管理系统--升鲜宝收银系统功能解析,登录、主界面UI 设计图(一)登录界面

振动电阻式传感器测量模块 差动电阻式 驱动与测量RM502

振动电阻式传感器测量模块 差动电阻式 驱动与测量RM502RM502模块是一款高精度、多功能的传感器驱动与测量解决方案。本产品采用先进的模拟信号处理技术,专为差动电阻式传感器及其他高精度电阻测量应用而设计。通过恒流驱动与4路实时电流测量技术,配合高精度采样电阻,有效消除…

No.13 CSS--简介

一、CSS 1.1概念CSS(Cascading Style Sheets)层叠样式表,又叫级联样式表,简称样式表。 CSS文件后缀名为 .css。 CSS用于HTML文档中元素样式的定义。1.2 作用使用css的目的就是让网页具有美观一致的页面。1.3 语法CSS 规则由两个主要的部分构成 : 选择器,以及一条或多条声明(…