GUI图形界面编程(Java)
GUI编程
组件
窗口
弹窗
面板
文本框
列表框
按钮
图片
监听事件
鼠标
键盘事件
破解工具
1、简介
Gui的核心技术:Swing、AWT
2、AWT
2.1、AWT介绍
1.包含了很多类和接口! GUI:图形用户界面编程
Eeclipse:Java
2.元素:窗口,按钮,文本框
3.java.awt
4.
2.2、组件和容器
2.2.1 Frame
public class TextFrame {
public static void main(String[] args) {
//Frame对象
Frame frame = new Frame("我的第一个Java图形界面窗口");
//设置可见性
frame.setVisible(true);
//设置窗口大小
frame.setSize(400,400);
//窗口背景颜色
frame.setBackground(new Color(78, 61, 151));
//弹出的初始位置
frame.setLocation(200,200);
//设置大小固定
frame.setResizable(false);
}
}
问题:发现窗口关闭不掉,终止Java程序运行
尝试回顾封装:
package com.sgd.lesson01;
import java.awt.*;
/**
* @author 邵国栋
* @function:
* @date 2021年07月02日 9:11
*/
public class TestFrame_ {
public static void main(String[] args) {
//展示多个窗口
MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.CYAN);
MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.GREEN);
MyFrame myFrame3 = new MyFrame(100, 300, 200, 200, Color.PINK);
}
}
class MyFrame extends Frame {
static int id = 0;//肯能存在多个窗口,需要一个计数器
public MyFrame(int x, int y, int w, int h, Color color) {
super("MyFrame+" + (id++));
setBackground(color);
setBounds(x, y, w, h);
setVisible(true);
setResizable(false);
}
}
2.2.2 面板Panel
解决了关闭事件
package com.sgd.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
/**
* @author 邵国栋
* @function:面板Panel的练习
* @date 2021年07月02日 9:49
*/
//可看成空间,但不能单独存在
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame();
//布局
Panel panel = new Panel();
//设置布局
frame.setLayout(null);
//坐标
frame.setBounds(300, 300, 500, 500);
frame.setBackground(new Color(65, 191, 18));
//panel坐标,相对于frame
panel.setBounds(50, 50, 400, 400);
panel.setBackground(new Color(10, 101, 10));
//frame.add(panel);
frame.add(panel);
frame.setResizable(false);
frame.setVisible(true);
//监听事件,监听窗口关闭事件 System.exit(0);
//适配器模式:
frame.addWindowListener(new WindowAdapter() {
//窗口点击关闭时要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
2.2.3 布局管理器
流式布局
package com.sgd.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:流式布局的练习
* @date 2021年07月02日 15:48
*/
public class TestFlowLayout {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setLocation(500,500);
//按钮--组件
Button button1 = new Button("Button1");
Button button2 = new Button("Button2");
Button button3 = new Button("Button3");
//流式布局的定义
//自定义为中 frame.setLayout(new FlowLayout());
//自定义为中
frame.setLayout(new FlowLayout(FlowLayout.LEFT));
//弹窗尺寸的定义
frame.setSize(200, 200);
//弹窗可视性的定义
frame.setVisible(true);
//加入按钮
frame.add(button1);
frame.add(button2);
frame.add(button3);
//窗口关闭操作
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
东西南北中
package com.sgd.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:东西南北中式布局
* @date 2021年07月02日 16:55
*/
public class TestBorderLayout {
public static void main(String[] args) {
Frame frame = new Frame("TestBorderLayout");
frame.setVisible(true);
frame.setLocation(200, 200);
frame.setSize(500, 500);
frame.setBackground(new Color(104, 16, 16));
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.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.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
表格布局 Grid
package com.sgd.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:表格布局
* @date 2021年07月02日 17:10
*/
public class TestGridLayout {
public static void main(String[] args) {
Frame frame = new Frame("TestGridLayout");
Button btn1 = new Button("btn1");
Button btn2 = new Button("btn2");
Button btn3 = new Button("btn3");
Button btn4 = new Button("btn4");
Button btn5 = new Button("btn5");
Button btn6 = new Button("btn6");
frame.setLayout(new GridLayout(3,2));
frame.add(btn1);
frame.add(btn2);
frame.add(btn3);
frame.add(btn4);
frame.add(btn5);
frame.add(btn6);
frame.pack();//Java函数:布局自动优化;
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
练习:
package com.sgd.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:
* @date 2021年07月02日 17:25
*/
public class Exercise1 {
public static void main(String[] args) {
Frame frame = new Frame("Exercise");
frame.setVisible(true);
frame.setLocation(100, 100);
frame.setSize(300, 400);
frame.setResizable(false);
Panel p1 = new Panel();
Panel p2 = new Panel();
Panel p3 = new Panel();
Panel p4 = new Panel();
frame.setLayout(new GridLayout(2, 1));
p1.setLayout(new BorderLayout());
p2.setLayout(new GridLayout(2, 1));
p3.setLayout(new BorderLayout());
p4.setLayout(new GridLayout(2, 2));
p1.add(new Button("but1"), BorderLayout.WEST);
p1.add(new Button("but2"), BorderLayout.EAST);
p2.add(new Button("p2-but.1"));
p2.add(new Button("p2-but.2"));
p1.add(p2, BorderLayout.CENTER);
p3.add(new Button("but3"), BorderLayout.WEST);
p3.add(new Button("but4"), BorderLayout.EAST);
p4.add(new Button("p4-but.1"));
p4.add(new Button("p4-but.2"));
p4.add(new Button("p4-but.3"));
p4.add(new Button("p4-but.4"));
p3.add(p4, BorderLayout.CENTER);
frame.add(p1);
frame.add(p3);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
总结:
Frame是顶级窗口
Panel必须添加在某个容器中显示
2.2.4 事件监听
事件监听:当某个事情发生的时候,干什么?
package com.sgd.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:对监听的练习
* @date 2021年07月03日 9:50
*/
public class TestActionEvent {
public static void main(String[] args) {
//按下按钮,触发一些事件
Button button = new Button("but");
Frame frame = new Frame("监听事件");
//流式分布
frame.setLayout(new FlowLayout());
//是否可改变窗口
frame.setResizable(false);
//可见性
frame.setVisible(true);
//初始位置
frame.setLocation(100, 100);
//窗口大小
frame.setSize(300, 500);
//添加按钮去窗口
frame.add(button);
//自己调节美观
frame.pack();
MyActionListener myActionListener = new MyActionListener();
button.addActionListener(myActionListener);
frameClose(frame);
}
//关闭窗口的事件
private static void frameClose(Frame frame){
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//事件监听
class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("OK!");
}
}
两个按钮实现同一个监听:
package com.sgd.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:两个按钮实现同一个监听: 开始、关闭
* @date 2021年07月19日 17:21
*/
public class TextActionTwo {
public static void main(String[] args) {
Frame frame = new Frame("开始 -- 关闭");
frame.setSize(400, 500);
frame.setLocation(200, 200);
frame.setResizable(false);
frame.setVisible(true);
frame.setBackground(new Color(20, 202, 20));
frame.setLayout(new FlowLayout(FlowLayout.CENTER));
Button button1 = new Button("start");
Button button2 = new Button("stop");
frame.add(button1);
frame.add(button2);
MyMonitor myMonitor = new MyMonitor();
//可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值 (stop) !
//可以多个按钮只写一个监听类
button2.setActionCommand("button2-stop");
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);
WindowClose(frame);
}
private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyMonitor implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//e.getActionCommand() -> 获取按钮上的一些信息
System.out.println("按钮被点击了,msg:" + e.getActionCommand());
//可根据按钮判断不同信息的输出
if (e.getActionCommand().equals("start")) {
System.out.println("start");
} else if (e.getActionCommand().equals("stop")) {
System.out.println("stop");
} else if(e.getActionCommand().equals("button2-stop")){
System.out.println("button2-stop");
}
}
}
2.2.5 输入框 TextField 监听
package com.sgd.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author 邵国栋
* @function:对GUI文本框的练习
* @date 2021年07月20日 15:35
*/
public class TextField01 {
public static void main(String[] args) {
//启动!
MyFrame myFrame = new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
TextField textField = new TextField();
add(textField);
//设置替换编码
textField.setEchoChar('*');
setVisible(true);
pack();
//监听这个文本框输入的文字
MyActionListener02 myActionListener02 = new MyActionListener02();
//按下Enter就会触发这个输入框的事件
textField.addActionListener(myActionListener02);
}
}
class MyActionListener02 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//获得一些资源,返回的一个对象
TextField field=(TextField) e.getSource();
System.out.println(field.getText());//获得输入框中的文本
field.setText("");//null ""
}
}
2.2.6 简单计算器,组合+内部类回顾复习!
oop原则:组合,大于继承!
目前代码:
package com.sgd.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:简易计算器的实现
* @date 2021年07月21日 10:03
*/
public class calExercise {
public static void main(String[] args) {
Calculator calculator = new Calculator();
WindowClose(calculator);
}
private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//计算器类
class Calculator extends Frame {
public Calculator() {
//3个文本框
TextField num01 = new TextField(10);//字符数
TextField num02 = new TextField(10);
TextField num03 = new TextField(20);
// 1个按钮
Button button = new Button("=");
button.addActionListener(new MyActionListener03(num01, num02, num03));
// 1个标签
Label label = new Label("+");
//流式布局
setLayout(new FlowLayout());
add(num01);
add(label);
add(num02);
add(button);
add(num03);
pack();
setVisible(true);
}
}
//监听器类
class MyActionListener03 implements ActionListener {
//获取3个变量
private TextField num01, num02, num03;
public MyActionListener03(TextField num01, TextField num02, TextField num03) {
this.num01 = num01;
this.num02 = num02;
this.num03 = num03;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(num01.getText());
int n2 = Integer.parseInt(num02.getText());
//2.运算后填到第3个框
num03.setText("" + (n1 + n2));
//3.清除前两个框
num01.setText("");
num02.setText("");
}
}
完全改造为面向对象:
package com.sgd.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:简易计算器的实现
* @date 2021年07月21日 10:03
*/
public class calExercise {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.loadFrame();
WindowClose(calculator);
}
//窗口监听
private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//计算器类
class Calculator extends Frame {
TextField num01, num02, num03;
public void loadFrame() {
//3个文本框
num01 = new TextField(10);//字符数
num02 = new TextField(10);
num03 = new TextField(20);
// 1个按钮
Button button = new Button("=");
button.addActionListener(new MyActionListener03(this));
// 1个标签
Label label = new Label("+");
//流式布局
setLayout(new FlowLayout());
add(num01);
add(label);
add(num02);
add(button);
add(num03);
pack();
setVisible(true);
}
}
//监听器类
class MyActionListener03 implements ActionListener {
//获取计算器这个对象
Calculator calculator = null;
//private TextField num01, num02, num03;
public MyActionListener03(Calculator calculator) {
this.calculator = calculator;
}
@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(calculator.num01.getText());
int n2 = Integer.parseInt(calculator.num02.getText());
//2.运算后填到第3个框
calculator.num03.setText("" + (n1 + n2));
//3.清除前两个框
calculator.num01.setText("");
calculator.num02.setText("");
}
}
内部类:
更好的包装
package com.sgd.lesson02;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @author 邵国栋
* @function:简易计算器的实现
* @date 2021年07月21日 10:03
*/
public class calExercise {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.loadFrame();
WindowClose(calculator);
}
//窗口监听
private static void WindowClose(Frame frame) {
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
//计算器类
class Calculator extends Frame {
TextField num01, num02, num03;
public void loadFrame() {
//3个文本框
num01 = new TextField(10);//字符数
num02 = new TextField(10);
num03 = new TextField(20);
// 1个按钮
Button button = new Button("=");
button.addActionListener(new MyActionListener03());
// 1个标签
Label label = new Label("+");
//流式布局
setLayout(new FlowLayout());
add(num01);
add(label);
add(num02);
add(button);
add(num03);
pack();
setVisible(true);
}
private class MyActionListener03 implements ActionListener {
/*
//获取计算器这个对象
Calculator calculator = null;
//private TextField num01, num02, num03;
public MyActionListener03(Calculator calculator) {
this.calculator = calculator;
}
*/
@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(num01.getText());
int n2 = Integer.parseInt(num02.getText());
//2.运算后填到第3个框
num03.setText("" + (n1 + n2));
//3.清除前两个框
num01.setText("");
num02.setText("");
}
}
}
//监听器类
class MyActionListener03 implements ActionListener {
/*
//获取计算器这个对象
Calculator calculator = null;
//private TextField num01, num02, num03;
public MyActionListener03(Calculator calculator) {
this.calculator = calculator;
}
*/
@Override
public void actionPerformed(ActionEvent e) {
//1.获得两个加数
int n1 = Integer.parseInt(num01.getText());
int n2 = Integer.parseInt(num02.getText());
//2.运算后填到第3个框
num03.setText("" + (n1 + n2));
//3.清除前两个框
num01.setText("");
num02.setText("");
}
}
2.2.7 画笔
package com.sgd.lesson03;
import java.awt.*;
/**
* @author 邵国栋
* @function:画笔练习
* @date 2021年07月26日 15:13
*/
public class TextPaint {
public static void main(String[] args) {
MyPaint myPaint = new MyPaint();
myPaint.loadFrame();
}
}
class MyPaint extends Frame {
public void loadFrame() {
setBounds(200,200,600,500);
setVisible(true);
}
@Override
public void paint(Graphics g) {
//super.paint(g);
//画笔需要有颜色,可以画画
g.setColor(Color.red);
g.drawOval(100,100,100,100);
g.fillOval(200,200,100,100);//实心的圆
g.setColor(Color.green);
g.fillRect(150,200,200,200);
//养成习惯,将画笔还原成最初的颜色
}
}
2.2.8 鼠标监听
目的:想要实现鼠标画画
2.2.9 窗口监听
2.2.10 键盘监听
3、Swing
GUI图形界面编程(Java)的更多相关文章
- Java基础(二十三)GUI图形界面编程(Java基础完)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
- java之 22天 GUI 图形界面编程(一)
转自:http://takeme.iteye.com/blog/1876850 GUI(图形用户界面) import java.awt.Button; import java.awt.FlowLayo ...
- java之 22天 GUI 图形界面编程(二)
转自:http://takeme.iteye.com/blog/1876853 模拟window开打文件 import java.awt.Button; import java.awt.Dialog; ...
- Java中的图形界面编程
前言 正文 Java中的图形界面编程 AWT/Swing AWT(Abstract Window ToolKits,抽象窗体工具集) 1.容器类:用来存储组件,实现容器布局 2.组件类:实现界面的一些 ...
- Quartz(GUI)图形界面程序----Quartz Web
下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用 ...
- 图形界面编程成就了C++
听有人说C#.VB比C++好是因为做界面方便还算傻得可爱,听有人说用C++做数值计算而不屑于做界面可就对不起咱C++的恩人了.这我可要说道说道. 想当年C++刚出江湖,名门出身,自立门派,想抢Obje ...
- Linux C 程序 GTK+图形界面编程(22)
GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...
- centOS7下安装GUI图形界面
1.如何在centOS7下安装GUI图形界面 当你安装centOS7服务器版本的时候,系统默认是不会安装GUI的图形界面程序,这个需要手动安装CentOS7 Gnome GUI包. 2.在系统下使用命 ...
- CentOS7安装GUI图形界面
本文转自centOS7下安装GUI图形界面,侵权删. 1. 在命令行下 输入下面的命令来安装Gnome包. # yum groupinstall "GNOME Desktop" & ...
- CentOS7 下安装GUI图形界面GNOME
在安装Gnome包之前,需要检查一下网络是否有网络(使用ping www.baidu.com) 一.先装X windows,-y表示参数同意所有软件安装操,当出现 Complete!说明这里安装成功了 ...
随机推荐
- Qt开发经验小技巧261-265
代码中判断当前Qt库是32位还是64位,用QSysInfo::WordSize=32/64. QTreeView控件设置左侧branch图标大小,无法通过qss设置,万能大法查看源码得知控制宽度最后取 ...
- Qt开源作品36-程序守护进程
一.前言 没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到, ...
- [LC1260]二维网格迁移
二维网格迁移 题目描述 给你一个 m 行 n 列的二维网格 grid 和一个整数 k.你需要将 grid 迁移 k 次. 每次「迁移」操作将会引发下述活动: 位于 grid[i][j] 的元素将会移动 ...
- 使用GPIO判断网线拔插
USB网卡和以太网交换机"常连"后,增加交换机插拔网线判断机制 这个项目已经做了小半年了,客户是一个做智能电话机的.所谓的智能电话就是一台可以插网线.电话线,外观却是座机的手机. ...
- 使用Python的一维卷积
学习&转载文章:使用Python的一维卷积 背景 在开发机器学习算法时,最重要的事情之一(如果不是最重要的话)是提取最相关的特征,这是在项目的特征工程部分中完成的. 在CNNs中,此过程由网络 ...
- Eclipse中的快捷键:批量修改指定的变量名、方法名、类名等:alt + shift + r
/* * Eclipse中的快捷键: * 1.补全代码的声明:alt + / * 2.快速修复: ctrl + 1 * 3.批量导包:ctrl + shift + o * 4.使用单行注释:ctrl ...
- .NET Core GC压缩(compact_phase)底层原理浅谈
简介 终于来到了GC的最后一个步骤,在此之间,大量预备工作已经完成.万事俱备,只欠东风 清除 如果GC决定不压缩,它将仅执行清除操作.清除操作非常简单,把所有不可到达对象(gap),转换成Free.也 ...
- Java03-程序流程控制
Java程序流程控制 [ 任务列表 ] 1.选择结构(if.switch) 2.循环结构(for.while.do-while) 3.跳转关键字(break.continue.return) 4.其他 ...
- java中的HsahMap
HsahMap HashMap 是 Java 中最常用的集合类之一,它实现了 Map 接口,基于哈希表存储键值对 HashMap的存储是无顺序的 HashMap存储的是键值对(key-value)其中 ...
- 从理房间到移动零:一道考察数组操作的经典题目|LeetCode 283 移动零
LeetCode 283 移动零 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 你有没有整理过房间?常常会发现一些要丢掉的东西,但又不想立刻处 ...