GUI编程
GUI编程
- 告诉大家该怎么学?
- 这是什么
- 它怎么玩
- 该如何去在我们平时运用
- 组件
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 图片
- 监听事件
- 鼠标
- 键盘事件
- 破解工具
1.简介
- Gui的核心技术:Swing AWT
- 因为界面不美观
- 需要jre环境 —逐渐被淘汰
- 为什么我们要学习
- 可以写出自己心中想要的一些小工具
- 工作的时候,也可能需要维护到swing界面,概率极小
- 了解MVC架构,了解监听!
2.AWT
-
Awt介绍
- 包含了很多类和接口!GUI:图形用户界面
- 元素:窗口,按钮,文本框
- java.awt
- 组件:包含一些基本组件(button TextArea Label …) 还有容器(Container)基本组件就是存放在容器中
-
组件和容器
package com.wang.lesson01; import java.awt.*; /** * @Auther: 王海新 * @Date: 2021/2/6 11:21 * @Description: GUUI的第一个界面 */ public class TestFrame { public static void main(String[] args) { //Frame,JDK,看源码(不懂了就直接点进去看源码就可以) Frame frame = new Frame("我的第一个java图形界面窗口"); //需要设置可见性 frame.setVisible(true); //设置窗口大小 frame.setSize(400,400); //设置背景颜色 frame.setBackground(new Color(104, 135, 219)); //设置初始化位置 frame.setLocation(200,200); //设置大小固定 //frame.setResizable(false); } }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwqI2KcS-1612844171024)(C:\Users\黑白客\AppData\Roaming\Typora\typora-user-images\image-20210206112937251.png)]
回顾封装:
package com.wang.lesson01; import java.awt.*; /** * @Auther: 王海新 * @Date: 2021/2/6 11:44 * @Description: */ public 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); } }
package com.wang.lesson01;
import java.awt.*;
/**
* @Auther: 王海新
* @Date: 2021/2/6 11:40
* @Description: 展示多个窗口 new
*/
public class TestFrame2 {
public static void main(String[] args) {
new MyFrame(100,100,200,200,Color.BLACK);
new MyFrame(300,100,200,200,Color.BLUE);
new MyFrame(100,300,200,200,Color.yellow);
new MyFrame(300,300,200,200,Color.red);
}
}
面板Panel
package com.wang.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @Auther: 王海新
* @Date: 2021/2/6 16:17
* @Description:
*/
public class TestPannel {
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(85, 186, 85));
//panel 设置坐标,相对于frame
panel.setBounds(50,50,400,400);
panel.setBackground(new Color(193,15,63));
//frame.add(panel)
frame.add(panel);
frame.setVisible(true);
//监听事件,监听窗口关闭事件System.exit(0) 0 是正常关闭,1是有异常的关闭
//适配器模式:
frame.addWindowListener(new WindowAdapter() {
//窗口点击关闭的时候需要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
问题:发现窗口关闭不了
package com.wang.lesson01;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @Auther: 王海新
* @Date: 2021/2/6 16:17
* @Description:
*/
public class TestPannel {
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(85, 186, 85));
//panel 设置坐标,相对于frame
panel.setBounds(50,50,400,400);
panel.setBackground(new Color(193,15,63));
//frame.add(panel)
frame.add(panel);
frame.setVisible(true);
//监听事件,监听窗口关闭事件System.exit(0) 0 是正常关闭,1是有异常的关闭
//适配器模式:
frame.addWindowListener(new WindowAdapter() {
//窗口点击关闭的时候需要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
布局管理器
- 流式布局
package com.wang.lesson01;
import java.awt.*;
/**
* @Auther: 王海新
* @Date: 2021/2/6 17:02
* @Description:流式布局
*/
public class TestFlowLayout {
public static void main(String[] args) {
Frame frame = new Frame();
//组件-按钮
Button button1 = new Button("button1");
Button button2 = new Button("button2");
Button button3 = new Button("button3");
//设置为流式布局
frame.setLayout(new FlowLayout());
//设置大小
frame.setSize(200,200);
//把按钮添加上去
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.setVisible(true);
}
}
-
东南西北中
package com.wang.lesson01; import java.awt.*; /** * @Auther: 王海新 * @Date: 2021/2/7 18:03 * @Description: 东西南北中 */ public class TestBorderLayout { public static void main(String[] args) { //创建了一个面板 Frame frame = new Frame("TestBorderLayout"); //创建了东西南北中四个按钮 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.setSize(200,200); //设置面板为可显示 frame.setVisible(true); } }
-
表格布局Grid
package com.wang.lesson01; import java.awt.*; /** * @Auther: 王海新 * @Date: 2021/2/7 18:16 * @Description: 表格布局 */ public class TestGridLayout { public static void main(String[] args) { Frame frame = new Frame("TestGridLayout"); //创建了东西南北中四个按钮 Button but1 = new Button("but1"); Button but2 = new Button("but2"); Button but3 = new Button("but3"); Button but4 = new Button("but4"); Button but5 = new Button("but5"); Button but6 = new Button("but6"); frame.setLayout(new GridLayout(3,2)); frame.add(but1); frame.add(but2); frame.add(but3); frame.add(but4); frame.add(but5); frame.add(but6); frame.pack();//java函数 frame.setVisible(true); } }
-
总结:小demo
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DhYMvNeP-1612844171028)(C:\Users\黑白客\AppData\Roaming\Typora\typora-user-images\image-20210208151738160.png)]
制作这样一个面板
package com.wang.lesson01; import java.awt.*; /** * @Auther: 王海新 * @Date: 2021/2/8 14:50 * @Description: 小结作业。 */ public class ExDemo { public static void main(String[] args) { //总 Frame Frame frame = new Frame(); frame.setSize(400,300); frame.setLocation(300,400); frame.setBackground(Color.BLACK); frame.setVisible(true); //将整体分割成两行一列,表格布局 frame.setLayout(new GridLayout(2,1)); //四个面板 Panel p1 = new Panel(new BorderLayout()); Panel p2 = new Panel(new GridLayout(2, 1)); //东南西北中布局 Panel p3 = new Panel(new BorderLayout()); Panel p4 = new Panel(new GridLayout(2, 2)); //上面ok p1.add(new Button("East-1"),BorderLayout.EAST); p1.add(new Button("West-1"),BorderLayout.WEST); p2.add(new Button("p2-btn-1")); p2.add(new Button("p2-btn-2")); p1.add(p2,BorderLayout.CENTER); //下面OK p3.add(new Button("East-1"),BorderLayout.EAST); p3.add(new Button("West-1"),BorderLayout.WEST); for (int i = 0; i < 4; i++) { p4.add(new Button("for-" + i)); } 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无法单独显示,必须添加到某个容器中。
- 布局管理器
- 流式
- 东西南北中
- 表格
- 大小,定位,背景颜色,可见性,监听!
事件监听
事件监听:当某个事情发生的时候,干什么?
package com.wang.lesson01;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* @Auther: 王海新
* @Date: 2021/2/8 15:32
* @Description: 监听器
*/
public class TestActionEvent {
public static void main(String[] args) {
//按下按钮,触发一些事件
Frame frame = new Frame();
Button button = new Button();
//因为addActionListener();需要一个ActionListener(),所以我们去构造一个
MyActionListener myActionListener = new MyActionListener();
button.addActionListener(myActionListener);
frame.add(button,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
windowClose(frame);//关闭窗口
}
//关闭窗口方法
public static void windowClose(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("aa");
}
}
多个按钮,共享一个监听
package com.wang.lesson01;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @Auther: 王海新
* @Date: 2021/2/9 11:54
* @Description: 两个按钮公用一个监听器
*/
public class TestActionTwo {
public static void main(String[] args) {
// 两个按钮,实现同一个监听器
// 开始 停止
Frame frame = new Frame("开始-停止");
Button button1 = new Button("start");
Button button2 = new Button("start");
//可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值
//可以多个按钮,只写一个监听器。
button2.setActionCommand("button-stop");
MyMonitor myMonitor = new MyMonitor();
button1.addActionListener(myMonitor);
button2.addActionListener(myMonitor);
frame.add(button1,BorderLayout.NORTH);
frame.add(button2,BorderLayout.SOUTH);
//自适应
frame.pack();
//显示面板
frame.setVisible(true);
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了:msg"+ e.getActionCommand());
if (e.getActionCommand().equals("start")) {
//这里实现某个按钮的单独功能
}
}
}