布局管理器
一、布局管理器
- 流式布局
- 东西南北中
- 表格布局
1.1 流式布局 FlowLayout
import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/*** @Auther: 小雷学长* @Date: 2022/3/12 - 23:59* @Version: 1.8*/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, 200);//将按钮添加上去frame.add(button1);frame.add(button2);frame.add(button3);frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}

1.2 东西南北中 BroderLayout
package GUI;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/*** @Auther: 小雷学长* @Date: 2022/3/13 - 15:33* @Version: 1.8*/public class TestBorderLayout {public static void main(String[] args) {Frame frame = new Frame("TestBorderLayout");frame.setVisible(true);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,300);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}

1.3 表格布局 GridLayout
package GUI;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/*** @Auther: 小雷学长* @Date: 2022/3/13 - 15:42* @Version: 1.8*/public class TestGridLayout {public static void main(String[] args) {Frame frame = new Frame("TestGridLayout");frame.setSize(500,600);Button btn1 = new Button ("btn1");Button btn2 = new Button ("btn2");Button btn3 = new Button ("btn3");Button btn4 = new Button ("bt4");Button btn5 = new Button("btn5");frame.setLayout(new GridLayout(3,1));frame.add(btn1);frame.add(btn2);frame.add(btn3);frame.add(btn4);frame.add(btn5);//java函数;自动布局frame.pack();frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}

1.4 练习
package GUI;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/*** @Auther: 小雷学长* @Date: 2022/3/13 - 16:03* @Version: 1.8*//*练习*/public class ExDemo {public static void main(String[] args) {//总frameFrame frame = new Frame();//两行一列frame.setLayout(new GridLayout(2, 1));//设置大小frame.setSize(400, 300);frame.setLocation(200, 200);//4个面板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, 1));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);p3.add(new Button("East-2"), BorderLayout.EAST);p3.add(new Button("West-2"), 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.setVisible(true);//监听frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}

1.5 布局管理器总结
- Frame是一个顶级窗口
- Panel无法单独显示,必须添加到某个容器中
布局管理器
- 流式 FlowLayout
- 东西南北中 BorderLayout
- 表格 GridLayout
- 属性:大小、定位、背景颜色、可见性、监听
二、事件监听
2.1 事件监听的理解
事件监听:当某个事情发生的时候,干什么?
package GUI.事件监听;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: 2022/3/13 - 16:28* @Version: 1.8*/public class TestActionEvent {public static void main(String[] args) {//按下按钮,触发一些事件Frame frame = new Frame();Button button = new Button();//因为addActionListener()需要一个ActionListener,所以需要构造一个ActionListenerMyActionListener myActionListener = new MyActionListener();button.addActionListener(myActionListener);frame.add(button);//自适应大小frame.pack();frame.setVisible(true);//调用方法 关闭窗口windowClose(frame);}/*** 关闭窗体的事件*/private static void windowClose(Frame frame) {//关闭窗口事件frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}/*** 事件监听* 写动作*/class MyActionListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("aa");}}

2.1.1 多个按钮可共享一个监听事件
package GUI.事件监听;/*** @Auther: 小雷学长* @Date: 2022/3/13 - 16:48* @Version: 1.8*/import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;/*** 两个按钮实现同一个监听*/public class TestActionEvent2 {public static void main(String[] args) {Frame frame = new Frame("开始-停止");Button button1 = new Button("start");Button button2 = new Button("stop");//可以显示的定义会触发返回的命令,如果不显示定义,则会走默认的值//可以多个按钮只写一个监听类button2.setActionCommand("button2-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 {@Overridepublic void actionPerformed(ActionEvent e) {//e.getActionCommand() 获取按钮的信息System.out.println("按钮被点击了:msg" + e.getActionCommand());}}

三、输入框 TextField监听
3.1 输入框
package GUI.事件监听;/*** @Auther: 小雷学长* @Date: 2022/3/13 - 21:27* @Version: 1.8*/import com.sun.xml.internal.bind.v2.runtime.reflect.opt.FieldAccessor_Double;import sun.awt.WindowClosingListener;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/*** 输入框*/public class TestText01 {public static void main(String[] args) {//到公司企业中,main方法只管 启动!! 不放代码MyFrame myFrame = new MyFrame();}}class MyFrame extends Frame {//构造器public MyFrame() {TextField textField = new TextField();//添加这个文本框add(textField);//按下回车,就会出发输入框事件MyActionListener2 myActionListener2 = new MyActionListener2();//监听这个文本框输入的文字textField.addActionListener(myActionListener2);//设置替换编码,保证其安全性textField.setEchoChar('*');pack();setVisible(true);}class MyActionListener2 implements ActionListener {/** actionperformed方法是ActionListener监听事件中的一个重写方法,* 如果要求按钮执行一些动作,可以在这个方法中添加、修改、删除以及判断*/@Overridepublic void actionPerformed(ActionEvent e) {//获得一些资源,返回一个对象TextField field = (TextField) e.getSource();//获得输入框中的文本field.getText();//打印System.out.println(field.getText());//点击回车清空输入框内容field.setText("");}}}

3.2 简易计算器,组合+内部类回顾复习
(1)组合的理解
oop原则:组合,大于继承!
class A extends B {}class A{public B b;}
(2)实现计算器
a) 基础篇
package GUI.事件监听;/*** @Auther: 小雷学长* @Date: 2022/3/13 - 22:01* @Version: 1.8*/import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;/*** 简易计算器*/public class TestCalc {public static void main(String[] args) {Calculator calculator = new Calculator();}}/*** 计算器类*/class Calculator extends Frame {public Calculator() {//3个文本框TextField num1 = new TextField(10);//字符数TextField num2 = new TextField(10);//字符数TextField num3 = new TextField(20);//字符数// 一个按钮Button btn1 = new Button("=");//给按钮做一个监听事件btn1.addActionListener(new MyCalculator(num1, num2, num3));//一个标签Label label = new Label("+");//布局setLayout(new FlowLayout());//流式布局add(num1);add(label);add(num2);add(btn1);add(num3);pack();setVisible(true);}}/*** 监听器类*/class MyCalculator implements ActionListener {private TextField num1, num2, num3;//获取三个变量public MyCalculator(TextField num1, TextField num2, TextField num3) {this.num1 = num1;this.num2 = num2;this.num3 = num3;}@Overridepublic void actionPerformed(ActionEvent e) {//获得加数与被加数int n1 = Integer.parseInt(num1.getText());//String类型转换为int类型int n2 = Integer.parseInt(num2.getText());//String类型转换为int类型//加法运算后放到第三个框num3.setText(""+(n1+n2));//清除前两个框num1.setText("");num2.setText("");}}
