GUI编程
- 这是什么?
- 它怎么玩?
- 我们平时该如何应用?
组件
- 窗口
- 弹窗
- 面板
- 文本框
- 列表框
- 按钮
- 图片
- 监听事件
- 鼠标
- 键盘
- 破解工具
1、简介
GUi 的核心技术 : Swinng , AWT ,学GUI 就是学这两个类。
不常用:因为界面不美观,需要Jre环境!
为什么我们要学习?
- 可以写出自己心中想要的一些小工具
- 工作时候,也可能需要维护到swing界面,概率极小
- 了解MVC架构,了解监听!
2、AWT
2.1、Awt介绍
2.2、组件和容器
1、Frame
public class TextFrame {
public static void main(String[] args) {
//Frame JDk 看源码!
Frame frame = new Frame("我的第一个窗口");
//设置可见性
frame.setVisible(true);
//设置大小
frame.setSize(500,500);
//设置初始位置
frame.setLocation(200,200);
//设置背景颜色
frame.setBackground(new Color(140, 238, 181));
//设置大小固定,不可拉伸,默认可拉伸
frame.setResizable(false);
}
}
问题:发现窗口关闭不了
尝试回顾封装:
public class TextFrame2 {
public static void main(String[] args) {
//展示多个窗口
new MyFrame(100,100,200,200,Color.BLUE);
new MyFrame(300,100,200,200,Color.cyan);
new MyFrame(100,300,200,200,Color.darkGray);
new MyFrame(300,300,200,200,Color.green);
}
}
//尝试回顾封装:
class MyFrame extends Frame{
//设置计时器
static int count = 0;
public MyFrame(int x,int y,int w,int h,Color color){
super("MyFrame" + (++count));
setBounds(x,y,w,h);
setBackground(color);
setVisible(true);
}
}
2、面板(内嵌)
解决了关闭事件!
public class TestPanel {
//panel可以看成一个空间,但是不能单独存在,内嵌于
public static void main(String[] args) {
Frame frame = new Frame();
Panel panel = new Panel();
//设置布局 ???
frame.setLayout(null);
//坐标大小
frame.setBounds(100,100,500,500);
frame.setBackground(new Color(64, 133, 69));
//坐标,相对于frame, 或者说是将要内嵌的组件,其位置的相对的
panel.setBounds(50,50,100,100);
panel.setBackground(Color.CYAN);
//添加组件,panel是组件的一个子类
frame.add(panel);
//设置可见性
frame.setVisible(true);
//监听事件,监听窗口关闭事件,System.exit(0) 强制退出,0 表示正常退出,1代表异常退出
//适配器模式: new 需要类的时候,可能需要重写很多方法,可new 其子类,重写需要重写的方法。
//WindowAdapter 继承 WindowListener
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
3、布局管理器(setLayout)
-
流式布局
public class TestFlowLayout { //流式布局 public static void main(String[] args) { Frame frame = new Frame(); frame.setBounds(200,200,300,300); //流式布局 ,默认居中 frame.setLayout(new FlowLayout()); //frame.setLayout(new FlowLayout(FlowLayout.LEFT)); //frame.setLayout(new FlowLayout(FlowLayout.RIGHT)); frame.setVisible(true); Button button1 = new Button("button1"); Button button2 = new Button("button2"); Button button3 = new Button("button3"); frame.add(button1); frame.add(button2); frame.add(button3); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
-
东西南北中
public class TestBorderLayout { 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"); //BorderLayout 东西南北中布局 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(300,300); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
-
表格布局
public class TestGridLayout {
public static void main(String[] args) {
Frame frame = new Frame();
frame.setLayout(new GridLayout(2,3));
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.add(btn1);
frame.add(btn2);
frame.add(btn3);
frame.add(btn4);
frame.add(btn5);
frame.add(btn6);
frame.pack(); //java函数,作用自动优化位置
frame.setVisible(true);
}
}
- 布局练习,布局之间的嵌套
//课堂练习
public class Test {
public static void main(String[] args) {
//总分去思考
//用容器去分块,容器内可设置新的布局,容器是组件的子类
//可把容器视为特殊的组件
Frame frame = new Frame();
frame.setLayout(new GridLayout(2,1));
frame.setSize(300,400);
frame.setLocation(300,300);
frame.setVisible(true);
//上
Panel p1 = new Panel(new BorderLayout());
p1.add(new Button("btn1"),BorderLayout.EAST);
p1.add(new Button("btn2"),BorderLayout.WEST);
Panel p2 = new Panel(new GridLayout(2,1));
p2.add(new Button("btn3"));
p2.add(new Button("btn4"));
p1.add(p2,BorderLayout.CENTER);
//下
Panel p3 = new Panel(new BorderLayout());
p3.add(new Button("btn5"),BorderLayout.EAST);
p3.add(new Button("btn6"),BorderLayout.WEST);
Panel p4 = new Panel(new GridLayout(2, 2));
p4.add(new Button("btn7"));
p4.add(new Button("btn8"));
p4.add(new Button("btn9"));
p4.add(new Button("btn10"));
p3.add(p4,BorderLayout.CENTER);
//总
frame.add(p1);
frame.add(p3);
frame.pack();
}
}
总结:
- Frame 是一个顶级窗口
- Panel 无法单独显示,必须添加到某个容器中
- 布局管理器
- 流式
- 东西南北中
- 表格
4、事件监听
事件监听:当某个事情发生的时候,干什么?