布局管理器

一、布局管理器

  • 流式布局
  • 东西南北中
  • 表格布局

1.1 流式布局 FlowLayout

  1. import java.awt.*;
  2. import java.awt.event.WindowAdapter;
  3. import java.awt.event.WindowEvent;
  4. /**
  5. * @Auther: 小雷学长
  6. * @Date: 2022/3/12 - 23:59
  7. * @Version: 1.8
  8. */
  9. public class TestFlowLayout {
  10. public static void main(String[] args) {
  11. Frame frame = new Frame();
  12. //组件-按钮
  13. Button button1 = new Button("button1");
  14. Button button2 = new Button("button2");
  15. Button button3 = new Button("button3");
  16. //设置为流式布局式
  17. //frame.setLayout(new FlowLayout());
  18. frame.setLayout(new FlowLayout(FlowLayout.LEFT));
  19. frame.setSize(200, 200);
  20. //将按钮添加上去
  21. frame.add(button1);
  22. frame.add(button2);
  23. frame.add(button3);
  24. frame.setVisible(true);
  25. frame.addWindowListener(new WindowAdapter() {
  26. @Override
  27. public void windowClosing(WindowEvent e) {
  28. System.exit(0);
  29. }
  30. });
  31. }
  32. }

3、布局管理器 - 图1

1.2 东西南北中 BroderLayout

  1. package GUI;
  2. import java.awt.*;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. /**
  6. * @Auther: 小雷学长
  7. * @Date: 2022/3/13 - 15:33
  8. * @Version: 1.8
  9. */
  10. public class TestBorderLayout {
  11. public static void main(String[] args) {
  12. Frame frame = new Frame("TestBorderLayout");
  13. frame.setVisible(true);
  14. Button east = new Button ("East");
  15. Button west = new Button ("West");
  16. Button south = new Button ("South");
  17. Button north = new Button ("North");
  18. Button center = new Button("Center");
  19. frame.add(east,BorderLayout.EAST);
  20. frame.add(west,BorderLayout.WEST);
  21. frame.add(south,BorderLayout.SOUTH);
  22. frame.add(north,BorderLayout.NORTH);
  23. frame.add(center,BorderLayout.CENTER);
  24. frame.setSize(200,300);
  25. frame.addWindowListener(new WindowAdapter() {
  26. @Override
  27. public void windowClosing(WindowEvent e) {
  28. System.exit(0);
  29. }
  30. });
  31. }
  32. }

3、布局管理器 - 图2

1.3 表格布局 GridLayout

  1. package GUI;
  2. import java.awt.*;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. /**
  6. * @Auther: 小雷学长
  7. * @Date: 2022/3/13 - 15:42
  8. * @Version: 1.8
  9. */
  10. public class TestGridLayout {
  11. public static void main(String[] args) {
  12. Frame frame = new Frame("TestGridLayout");
  13. frame.setSize(500,600);
  14. Button btn1 = new Button ("btn1");
  15. Button btn2 = new Button ("btn2");
  16. Button btn3 = new Button ("btn3");
  17. Button btn4 = new Button ("bt4");
  18. Button btn5 = new Button("btn5");
  19. frame.setLayout(new GridLayout(3,1));
  20. frame.add(btn1);
  21. frame.add(btn2);
  22. frame.add(btn3);
  23. frame.add(btn4);
  24. frame.add(btn5);
  25. //java函数;自动布局
  26. frame.pack();
  27. frame.setVisible(true);
  28. frame.addWindowListener(new WindowAdapter() {
  29. @Override
  30. public void windowClosing(WindowEvent e) {
  31. System.exit(0);
  32. }
  33. });
  34. }
  35. }

3、布局管理器 - 图3

1.4 练习

  1. package GUI;
  2. import java.awt.*;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. /**
  6. * @Auther: 小雷学长
  7. * @Date: 2022/3/13 - 16:03
  8. * @Version: 1.8
  9. */
  10. /*
  11. 练习
  12. */
  13. public class ExDemo {
  14. public static void main(String[] args) {
  15. //总frame
  16. Frame frame = new Frame();
  17. //两行一列
  18. frame.setLayout(new GridLayout(2, 1));
  19. //设置大小
  20. frame.setSize(400, 300);
  21. frame.setLocation(200, 200);
  22. //4个面板
  23. Panel p1 = new Panel(new BorderLayout());
  24. Panel p2 = new Panel(new GridLayout(2, 1));
  25. Panel p3 = new Panel(new BorderLayout());
  26. Panel p4 = new Panel(new GridLayout(2, 1));
  27. p1.add(new Button("East-1"), BorderLayout.EAST);
  28. p1.add(new Button("West-1"), BorderLayout.WEST);
  29. p2.add(new Button("P2-btn-1"));
  30. p2.add(new Button("P2-btn-2"));
  31. p1.add(p2, BorderLayout.CENTER);
  32. p3.add(new Button("East-2"), BorderLayout.EAST);
  33. p3.add(new Button("West-2"), BorderLayout.WEST);
  34. for (int i = 0; i < 4; i++) {
  35. p4.add(new Button("for-" + i));
  36. }
  37. p3.add(p4, BorderLayout.CENTER);
  38. frame.add(p1);
  39. frame.add(p3);
  40. //可视化
  41. frame.setVisible(true);
  42. //监听
  43. frame.addWindowListener(new WindowAdapter() {
  44. @Override
  45. public void windowClosing(WindowEvent e) {
  46. System.exit(0);
  47. }
  48. });
  49. }
  50. }

3、布局管理器 - 图4

1.5 布局管理器总结

  • Frame是一个顶级窗口
  • Panel无法单独显示,必须添加到某个容器中
  • 布局管理器

    • 流式 FlowLayout
    • 东西南北中 BorderLayout
    • 表格 GridLayout
  • 属性:大小、定位、背景颜色、可见性、监听

二、事件监听

2.1 事件监听的理解

事件监听:当某个事情发生的时候,干什么?

  1. package GUI.事件监听;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.WindowAdapter;
  6. import java.awt.event.WindowEvent;
  7. /**
  8. * @Auther: 小雷学长
  9. * @Date: 2022/3/13 - 16:28
  10. * @Version: 1.8
  11. */
  12. public class TestActionEvent {
  13. public static void main(String[] args) {
  14. //按下按钮,触发一些事件
  15. Frame frame = new Frame();
  16. Button button = new Button();
  17. //因为addActionListener()需要一个ActionListener,所以需要构造一个ActionListener
  18. MyActionListener myActionListener = new MyActionListener();
  19. button.addActionListener(myActionListener);
  20. frame.add(button);
  21. //自适应大小
  22. frame.pack();
  23. frame.setVisible(true);
  24. //调用方法 关闭窗口
  25. windowClose(frame);
  26. }
  27. /**
  28. * 关闭窗体的事件
  29. */
  30. private static void windowClose(Frame frame) {
  31. //关闭窗口事件
  32. frame.addWindowListener(new WindowAdapter() {
  33. @Override
  34. public void windowClosing(WindowEvent e) {
  35. System.exit(0);
  36. }
  37. });
  38. }
  39. }
  40. /**
  41. * 事件监听
  42. * 写动作
  43. */
  44. class MyActionListener implements ActionListener {
  45. @Override
  46. public void actionPerformed(ActionEvent e) {
  47. System.out.println("aa");
  48. }
  49. }

3、布局管理器 - 图5

2.1.1 多个按钮可共享一个监听事件

  1. package GUI.事件监听;
  2. /**
  3. * @Auther: 小雷学长
  4. * @Date: 2022/3/13 - 16:48
  5. * @Version: 1.8
  6. */
  7. import java.awt.*;
  8. import java.awt.event.ActionEvent;
  9. import java.awt.event.ActionListener;
  10. /**
  11. * 两个按钮实现同一个监听
  12. */
  13. public class TestActionEvent2 {
  14. public static void main(String[] args) {
  15. Frame frame = new Frame("开始-停止");
  16. Button button1 = new Button("start");
  17. Button button2 = new Button("stop");
  18. //可以显示的定义会触发返回的命令,如果不显示定义,则会走默认的值
  19. //可以多个按钮只写一个监听类
  20. button2.setActionCommand("button2-stop");
  21. MyMonitor myMonitor = new MyMonitor();
  22. button1.addActionListener(myMonitor);
  23. button2.addActionListener(myMonitor);
  24. frame.add(button1,BorderLayout.NORTH);
  25. frame.add(button2,BorderLayout.SOUTH);
  26. frame.pack();
  27. frame.setVisible(true);
  28. }
  29. }
  30. /**
  31. * 事件监听
  32. */
  33. class MyMonitor implements ActionListener {
  34. @Override
  35. public void actionPerformed(ActionEvent e) {
  36. //e.getActionCommand() 获取按钮的信息
  37. System.out.println("按钮被点击了:msg" + e.getActionCommand());
  38. }
  39. }

3、布局管理器 - 图6

三、输入框 TextField监听

3.1 输入框

  1. package GUI.事件监听;
  2. /**
  3. * @Auther: 小雷学长
  4. * @Date: 2022/3/13 - 21:27
  5. * @Version: 1.8
  6. */
  7. import com.sun.xml.internal.bind.v2.runtime.reflect.opt.FieldAccessor_Double;
  8. import sun.awt.WindowClosingListener;
  9. import java.awt.*;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import java.awt.event.WindowAdapter;
  13. import java.awt.event.WindowEvent;
  14. /**
  15. * 输入框
  16. */
  17. public class TestText01 {
  18. public static void main(String[] args) {
  19. //到公司企业中,main方法只管 启动!! 不放代码
  20. MyFrame myFrame = new MyFrame();
  21. }
  22. }
  23. class MyFrame extends Frame {
  24. //构造器
  25. public MyFrame() {
  26. TextField textField = new TextField();
  27. //添加这个文本框
  28. add(textField);
  29. //按下回车,就会出发输入框事件
  30. MyActionListener2 myActionListener2 = new MyActionListener2();
  31. //监听这个文本框输入的文字
  32. textField.addActionListener(myActionListener2);
  33. //设置替换编码,保证其安全性
  34. textField.setEchoChar('*');
  35. pack();
  36. setVisible(true);
  37. }
  38. class MyActionListener2 implements ActionListener {
  39. /*
  40. * actionperformed方法是ActionListener监听事件中的一个重写方法,
  41. * 如果要求按钮执行一些动作,可以在这个方法中添加、修改、删除以及判断
  42. */
  43. @Override
  44. public void actionPerformed(ActionEvent e) {
  45. //获得一些资源,返回一个对象
  46. TextField field = (TextField) e.getSource();
  47. //获得输入框中的文本
  48. field.getText();
  49. //打印
  50. System.out.println(field.getText());
  51. //点击回车清空输入框内容
  52. field.setText("");
  53. }
  54. }
  55. }

3、布局管理器 - 图7

3.2 简易计算器,组合+内部类回顾复习

(1)组合的理解

oop原则:组合,大于继承!

  1. class A extends B {
  2. }
  3. class A{
  4. public B b;
  5. }

(2)实现计算器

a) 基础篇

  1. package GUI.事件监听;
  2. /**
  3. * @Auther: 小雷学长
  4. * @Date: 2022/3/13 - 22:01
  5. * @Version: 1.8
  6. */
  7. import java.awt.*;
  8. import java.awt.event.ActionEvent;
  9. import java.awt.event.ActionListener;
  10. /**
  11. * 简易计算器
  12. */
  13. public class TestCalc {
  14. public static void main(String[] args) {
  15. Calculator calculator = new Calculator();
  16. }
  17. }
  18. /**
  19. * 计算器类
  20. */
  21. class Calculator extends Frame {
  22. public Calculator() {
  23. //3个文本框
  24. TextField num1 = new TextField(10);//字符数
  25. TextField num2 = new TextField(10);//字符数
  26. TextField num3 = new TextField(20);//字符数
  27. // 一个按钮
  28. Button btn1 = new Button("=");
  29. //给按钮做一个监听事件
  30. btn1.addActionListener(new MyCalculator(num1, num2, num3));
  31. //一个标签
  32. Label label = new Label("+");
  33. //布局
  34. setLayout(new FlowLayout());//流式布局
  35. add(num1);
  36. add(label);
  37. add(num2);
  38. add(btn1);
  39. add(num3);
  40. pack();
  41. setVisible(true);
  42. }
  43. }
  44. /**
  45. * 监听器类
  46. */
  47. class MyCalculator implements ActionListener {
  48. private TextField num1, num2, num3;
  49. //获取三个变量
  50. public MyCalculator(TextField num1, TextField num2, TextField num3) {
  51. this.num1 = num1;
  52. this.num2 = num2;
  53. this.num3 = num3;
  54. }
  55. @Override
  56. public void actionPerformed(ActionEvent e) {
  57. //获得加数与被加数
  58. int n1 = Integer.parseInt(num1.getText());//String类型转换为int类型
  59. int n2 = Integer.parseInt(num2.getText());//String类型转换为int类型
  60. //加法运算后放到第三个框
  61. num3.setText(""+(n1+n2));
  62. //清除前两个框
  63. num1.setText("");
  64. num2.setText("");
  65. }
  66. }