GUI编程
简介
Gui的核心技术:Swing AWT
缺点
- 界面不美观
- 需要jre环境
好处
- 可以写出自己心中想要的一些小工具
- 工作时候,也可能需要维护到Swing界面,概率极小
- 了解MVC架构,了解监听
AWT
AWT介绍
- 包含了很多的类和接口!GUI:
- 元素:窗口,按钮,文本框
- java.awt
组件和容器
Frame界面
public static void main(String[] args) {
//编写第一个GUI界面
Frame frame=new Frame("第一个Java图像界面窗");
//设置可见性
frame.setVisible(true);
//设置窗口大小
frame.setSize(400, 400);
//设置背景颜色 Color
frame.setBackground(new Color(255, 255, 255));
//设置弹出的初始位置
frame.setLocation(200, 200);
//设置大小锁定
frame.setResizable(false);
}
问题:窗口关闭不掉,停止java程序即可
回顾封装:
public class MyFrame {
public static void main(String[] args) {
//展示多个窗口
CreatFrame mf1=new CreatFrame(100, 100, 200, 200, Color.blue);
CreatFrame mf2=new CreatFrame(300, 100, 200, 200, Color.green);
CreatFrame mf3=new CreatFrame(100, 300, 200, 200, Color.red);
CreatFrame mf4=new CreatFrame(300, 300, 200, 200, Color.magenta);
}
}
class CreatFrame extends Frame{
static int id=0;//可能存在多个窗口,需要一个计数器
public CreatFrame(int x,int y,int h,int w,Color color) {
super("MyFrame+"+(++id));
setBackground(color);
setBounds(x, y, w, h);
setVisible(true);
}
}
Panel面板
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
//panel可以看成是一个空间,但是不能单独存在
public class TsetPanel {
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(10,100,200));
//Panel设置坐标,相对于Frame
panel.setBounds(50, 50, 400, 400);
panel.setBackground(new Color(150,150,150));
//frame.add(panel)
frame.add(panel);
frame.setVisible(true);
//监听事件,监听窗口关闭时间 System.exit(0)
//适配器模式
frame.addWindowListener(new WindowAdapter() {
//窗口点击关闭的时候需要做的事情
@Override
public void windowClosing(WindowEvent e) {
//结束程序
System.exit(0);
}
});
}
}
布局管理器
- 流式布局
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");
//流式布局
// frame.setLayout(new FlowLayout());
// frame.setLayout(new FlowLayout(FlowLayout.LEFT));
frame.setLayout(new FlowLayout(FlowLayout.RIGHT));
frame.setSize(500, 500);
//添加按钮
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.setVisible(true);
}
- 东西南北中
public static void main(String[] args) {
Frame frame=new Frame();
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.setSize(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);
}
- 表格布局
表格布局组件数超过其容纳个数会自动优化以容纳这些组件
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.setLayout(new GridLayout(3,2));
frame.setSize(500, 500);
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.add(button4);
frame.add(button5);
frame.add(button6);
frame.pack();//java函数
frame.setVisible(true);
}
练习
public static void main(String[] args) {
Frame frame=new Frame();
Panel panel1=new Panel();
Panel panel2=new Panel();
Panel panel3=new Panel();
Panel panel4=new Panel();
Button b1=new Button("b1");
Button b2=new Button("b2");
Button b3=new Button("b3");
Button b4=new Button("b4");
Button b5=new Button("b5");
Button b6=new Button("b6");
Button b7=new Button("b7");
Button b8=new Button("b8");
Button b9=new Button("b9");
Button b10=new Button("b10");
frame.setLayout(new GridLayout(2,1));
panel1.setLayout(new BorderLayout());
panel2.setLayout(new GridLayout(2,1));
panel3.setLayout(new BorderLayout());
panel4.setLayout(new GridLayout(2,2));
panel1.add(b1,BorderLayout.EAST);
panel1.add(panel2,BorderLayout.CENTER);
panel1.add(b4,BorderLayout.WEST);
panel3.add(b5,BorderLayout.EAST);
panel3.add(panel4,BorderLayout.CENTER);
panel3.add(b10,BorderLayout.WEST);
panel2.add(b2);
panel2.add(b3);
panel4.add(b6);
panel4.add(b7);
panel4.add(b8);
panel4.add(b9);
frame.add(panel1);
frame.add(panel3);
frame.setSize(400, 400);
frame.setVisible(true);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PZPTuyP-1652448896853)(C:\Users\122618942\AppData\Roaming\Typora\typora-user-images\image-20220428175417232.png)]
总结:
- Frame是一个顶级窗口
- Panel无法单独显示,必须添加到某个容器中
- 布局管理器
- 流式
- 东南西北中
- 表格
- 大小,定位,背景颜色,可见,监听!
事件监听
- 当某个事情发生的时候,干什么?
public class TestActionListener {
public static void main(String[] args) {
Frame frame=new Frame();
Button button=new Button();
//需要一个ActionListener,创建一个ActionListener
MyActionListener myActionListener=new MyActionListener();
button.addActionListener(myActionListener);
frame.add(button,BorderLayout.CENTER);
frame.setVisible(true);
frame.setSize(200, 200