GUI
组件:
-
窗口
-
弹窗
-
面板
-
文本框
-
列表框
-
按钮
-
图片
-
监听事件
-
鼠标
-
键盘事件
-
破解工具
简介
Gui的核心技术:Swing、AWT
-
快淘汰的原因:
-
因为界面不美观
-
需要jre环境
-
-
学习的原因:
-
可以写出自己想要的小工具
-
工作时也可能需要维护到Swing界面(小概率)
-
了解MVC架构,了解监听
-
AWT
-
介绍new类!包括很多类和接口 Gui图形用户界面编程
-
元素:窗口、按钮、文本框
-
java.awt
组件和容器
```java package com.Liroou.lesson01; import java.awt.*; //GUI的第一个界面 public class TestFrame { public static void main(String[] args) { //Frame对象 看源码 Frame frame = new Frame("我的第一个Java图形界面窗口"); //窗口在内存里不能显示,需要设置可见性 frame.setVisible(true); //设置窗口大小 frame.setSize(400,400); //设置背景颜色 Color frame.setBackground(new Color(2, 255, 38)); //弹出窗口的初始位置 frame.setLocation(200,200); //设置大小固定 frame.setResizable(false); } } ``` 问题:窗口无法关闭 解决:停止Java程序运行
生成多个窗口
```java package com.Liroou.lesson01; import java.awt.*; public class TestFrame2 { public static void main(String[] args) { //展示多个窗口 MyFrame myFrame1 = new MyFrame(200, 400, 300, 400, Color.green); MyFrame myFrame2 = new MyFrame(500, 400, 300, 400, Color.red); MyFrame myFrame3 = new MyFrame(200, 800, 300, 400, Color.yellow); MyFrame myFrame4 = new MyFrame(500, 800, 300, 400, 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); } } ```
面板Panel
```java package com.Liroou.lesson01; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; //Panel可以看成是一个空间 但是不能单独存在 public class TestPanel1 { public static void main(String[] args) { Frame frame = new Frame(); //布局(FlowLayout)概念 Panel panel = new Panel(); //设置布局为默认无 frame.setLayout(null); //坐标 frame.setBounds(300,200,500,400); frame.setBackground(new Color(226, 162, 162)); //Panel设置坐标 相对于frame panel.setBounds(30,30,200,300); panel.setBackground(new Color(222, 65, 65)); //frame.add() frame.add(panel); frame.setVisible(true); //监听事件,监听窗口关闭事件System.exit(0);强制退出 //适配器模式 WindowAdapter frame.addWindowListener(new WindowAdapter() { //窗口点击关闭的时间,需要做的事情 @Override public void windowClosing(WindowEvent e) { //结束程序 解决关闭事件windowClosing System.exit(0); } }); } } ```
布局管理器
流式布局
``` java package com.Liroou.lesson01; import java.awt.*; 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.setLayout(new FlowLayout(FlowLayout.LEFT)); frame.setSize(200,300); //把按钮添加上去 frame.add(button1); frame.add(button2); frame.add(button3); frame.setVisible(true); } } ```
东西南北中
```java package com.Liroou.lesson01; import java.awt.*; 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(300,200); frame.setVisible(true); } } ```
表格布局(Grid)
```java package com.Liroou.lesson01; import java.awt.*; 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.setSize(500,500); frame.pack();//Java函数自动选择优秀的位置 不用设置大小 frame.setVisible(true); } } ```
练习
package com.Liroou.lesson01; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Test01 { public static void main(String[] args) { Frame frame = new Frame("Test01"); frame.setLayout(new GridLayout(2,1)); frame.setSize(400,400); frame.setVisible(true); //四个面板 Panel panel1 = new Panel(new BorderLayout()); Panel panel2 = new Panel(new GridLayout(2,1)); Panel panel3 = new Panel(new BorderLayout()); Panel panel4 = new Panel(new GridLayout(2,2)); //上 panel1.add(new Button("East-1"),BorderLayout.EAST); panel1.add(new Button("Weat-1"),BorderLayout.WEST); panel2.add(new Button("P2-btn-1")); panel2.add(new Button("P2-btn-2")); panel1.add(panel2,BorderLayout.CENTER); //下 panel3.add(new Button("East-2"),BorderLayout.EAST); panel3.add(new Button("West-2"),BorderLayout.WEST); // panel4.add(new Button("p4-btn-1")); // panel4.add(new Button("p4-btn-2")); // panel4.add(new Button("p4-btn-3")); // panel4.add(new Button("p4-btn-4")); 下面是代替方法 for (int i = 1; i <=4 ; i++) { panel4.add(new Button("p4-btn-"+i)); } panel3.add(panel4,BorderLayout.CENTER); // frame.add(panel1); frame.add(panel3); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
总结
-
Frame是一个顶级窗口
-
Panel无法独立显示,必须添加在某个容器中
-
属性:大小、定位,背景色
事件监听
当某个事情事情发生的时候,做出怎样的反应多个按钮公用一个监听
package com.Liroou.lesson02; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class TestAction02 { public static void main(String[] args) { //两个按钮实现同一个监听 Frame frame = new Frame("开始-停止"); Button b1 = new Button("start"); Button b2 = new Button("stop"); b2.setActionCommand("b2-stop"); MyMonitor myMonitor = new MyMonitor(); b1.addActionListener(myMonitor); b2.addActionListener(myMonitor); frame.add(b1,BorderLayout.NORTH); frame.add(b2,BorderLayout.SOUTH); frame.setVisible(true); frame.pack(); } } class MyMonitor implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { System.out.println("按钮被点击了"+e.getActionCommand()); } }
输入框
package com.Liroou.lesson02; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Test01 { public static void main(String[] args) { //启动 new MyFrame(); } } class MyFrame extends Frame{ public MyFrame(){ TextField textField = new TextField();//单行文本 add(textField); //监听这个文本框输入的文字 MyActionListener2 myActionListener2 = new MyActionListener2(); //按下enter就会触发这个输入框的事件 textField.addActionListener(myActionListener2); //设置替换编码 textField.setEchoChar('*'); setVisible(true); pack(); } } class MyActionListener2 implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { TextField field=(TextField) e.getSource();//获得一些资源 System.out.println(field.getText());//获得输入的文本 field.setText(""); } }