GUI编程

GUI编程

  • GUI核心技术: Swing AWT

    • 界面不美观
    • 需要jre环境
  • AWT

    • 包含很多类和接口,GUI

    • 元素:窗口,按钮,文本框

    • java.awt

    • 组件和容器

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7buKJBPp-1644999256586)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644888269680.png)]

    • 第一个Frame程序

      package base;
      
      import java.awt.*;
      
      public class MyFrame {
          public static void main(String[] args) {
              Frame frame = new Frame("窗口程序");
              //设置窗口可见性
              frame.setVisible(true);
              //设置窗口大小
              frame.setSize(400,400);
              //设置背景颜色
              frame.setBackground(new Color(110, 142, 246));
              //设置弹出位置
              frame.setLocation(200,200);
              //设置大小固定
              frame.setResizable(false);
          }
      }
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gib9VQZL-1644999256587)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644891209041.png)]

      问题:窗口无法正常关闭,需要停止java程序

      尝试回顾封装:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmvxMBik-1644999256588)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644891437047.png)]

      package base;
      import java.awt.*;
      
      public class MyFrame2 {
          public static void main(String[] args) {
              MyFrame01 myFrame01 = new MyFrame01(100, 100, 200, 200, Color.BLACK);
              MyFrame01 myFrame02 = new MyFrame01(300, 100, 200, 200, Color.yellow);
              MyFrame01 myFrame03 = new MyFrame01(100, 300, 200, 200, Color.red);
              MyFrame01 myFrame04 = new MyFrame01(300, 300, 200, 200, Color.green);
      
          }
      }
      
      class MyFrame01 extends Frame{
          static int id = 0; //可能存在多个窗口,需要计数器
          public MyFrame01(int x,int y ,int w,int h,Color color){
              super("Myframe+"+ (++id));
              setBounds(x,y,w,h);
              setVisible(true);
              setBackground(color);
          }
      
      }
      
    • Panel面板

      • 添加frame窗口关闭监听事件,解决无法关闭窗口问题
      package base;
      
      import java.awt.*;
      import java.awt.event.WindowAdapter;
      import java.awt.event.WindowEvent;
      
      //panel 可以看成一个空间,但是不能单独存在
      public class MyPanel {
          public static void main(String[] args) {
              Frame frame = new Frame();
              //布局的概念
              Panel panel = new Panel();
              //设置布局
              //panel.setLayout(null);
              //坐标
              frame.setBounds(300,300,500,500);
              frame.setBackground(new Color(110, 142, 246));
              //panel 设置坐标,相对于frame
              panel.setBounds(50,50,400,400);
              panel.setBackground(new Color(69, 117, 128));
      
              frame.add(panel);
              frame.setVisible(true);
      
              //监听事件,监听窗口关闭事件 system.exit(0)
              frame.addWindowListener(new WindowAdapter() {
                  @Override
                  public void windowClosing(WindowEvent e) {
                      //结束程序
                      System.exit(0);
                  }
              });
      
      
          }
      }
      
    • 布局管理器

      • 流式布局

        package base;
        
        import java.awt.*;
        
        public class FlowLayout {
            public static void main(String[] args) {
                Frame frame = new Frame();
        
                //组件-按钮
                Button but1 = new Button("button");
                Button but2 = new Button("button");
                Button but3 = new Button("button");
        
                frame.setLayout(new java.awt.FlowLayout());
                frame.setSize(200,200);
                frame.setVisible(true);
                frame.add(but1);
                frame.add(but2);
                frame.add(but3);
            }
        }
        
      • 东西南北中

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Q3kU9eh-1644999256589)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644895159860.png)]

        package base;
        
        import java.awt.*;
        
        public class Border {
            public static void main(String[] args) {
                Frame frame = new Frame();
                //组件-按钮
                Button but1 = new Button("east");
                Button but2 = new Button("west");
                Button but3 = new Button("south");
                Button but4 = new Button("north");
                Button but5 = new Button("center");
        
                frame.add(but1,BorderLayout.EAST);
                frame.add(but2,BorderLayout.WEST);
                frame.add(but3,BorderLayout.SOUTH);
                frame.add(but4,BorderLayout.NORTH);
                frame.add(but5,BorderLayout.CENTER);
        
                frame.setSize(500,400);
                frame.setVisible(true);
        
            }
        }
        
      • 表格布局

        • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aG4qv9aw-1644999256589)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644895599395.png)]

          package base;
          
          import java.awt.*;
          
          public class GridLayout {
              public static void main(String[] args) {
                  Frame frame = new Frame();
                  //组件-按钮
                  Button but1 = new Button("but1");
                  Button but2 = new Button("but2");
                  Button but3 = new Button("but3");
                  Button but4 = new Button("but4");
                  Button but5 = new Button("but5");
                  Button but6 = new Button("but6");
                  frame.setLayout(new java.awt.GridLayout(3,2));
                  frame.add(but1);
                  frame.add(but2);
                  frame.add(but3);
                  frame.add(but4);
                  frame.add(but5);
                  frame.add(but6);
                  frame.pack();
                  frame.setSize(400,500);
                  frame.setVisible(true);
              }
          
          }
          
    • 测试:实现如下布局

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KA8Yt7wj-1644999256590)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644897303899.png)]

        package base;
        
        import javafx.scene.layout.Pane;
        
        import java.awt.*;
        import java.awt.GridLayout;
        
        public class Border {
            public static void main(String[] args) {
                Frame frame = new Frame();
                /*
                1. panel panel2 分别将整体分割为上下两部分
                2. 上半部分可以看做左右按钮加中间一个panel存放上下两个按钮
                3. 下半部分可以看为左右按钮中加中间一个panel,panel存放四个按钮
                */
                
                Panel panel = new Panel();
                Panel panel2 = new Panel();
                panel.setBackground(new Color(1,1,1));
                panel2.setBackground(new Color(255,255,25));
                frame.setLayout(new java.awt.GridLayout(2,1));
                frame.add(panel);
                frame.add(panel2);
                Button but1 = new Button("east");
                Button but2 = new Button("west");
                Button but3 = new Button("south");
                Button but4 = new Button("north");
                Panel panel3 = new Panel();
                panel3.setLayout(new java.awt.GridLayout(2,1));
                panel3.add(but3);
                panel3.add(but4);
                panel.setLayout(new BorderLayout());
                panel.add(but1,BorderLayout.EAST);
                panel.add(but2,BorderLayout.WEST);
                panel.add(panel3,BorderLayout.CENTER);
        
        
        
                Button but5 = new Button("east");
                Button but6 = new Button("west");
                Button but7 = new Button("center");
                Button but8 = new Button("center");
                Button but9 = new Button("center");
                Button but10 = new Button("center");
        
                Panel panel4 = new Panel();
                panel4.setLayout(new GridLayout(2,2));
                panel4.add(but7);
                panel4.add(but8);
                panel4.add(but9);
                panel4.add(but10);
        
                panel2.setLayout(new BorderLayout());
                panel2.add(but5,BorderLayout.EAST);
                panel2.add(but6,BorderLayout.WEST);
                panel2.add(panel4,BorderLayout.CENTER);
        
        
                frame.setSize(500,400);
                frame.setVisible(true); //设置可见
                //添加窗口监听
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
        
            }
        }
        
        

        总结:

        1. Frame是一个顶级窗口
        2. Panel无法单独显示,必须添加到某个容器中。
        3. 布局管理
        4. 流式
        5. 东西南北中
        6. 表格
        7. 大小,定位,背景颜色,可见性,监听
    事件监听
    package base;
    
    
    import java.awt.*;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    public class ActionEvent {
        public static void main(String[] args) {
            //按下按钮触发事件
            Frame frame = new Frame();
            Button button = new Button("button");
            //因为addActionListener需要一个ActionListener,所有需要构造一个ActionListener
            MyActionListener myActionListener = new MyActionListener();
            button.addActionListener(myActionListener);
    
            frame.add(button,BorderLayout.CENTER);
            frame.setVisible(true);
            frame.pack();
            frame.setSize(400,400);
            windowClose(frame);
        }
    
        //关闭窗体的事件
        private static void windowClose(Frame frame){
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
        }
    }
    
    //按钮点击事件
    class MyActionListener implements ActionListener{
    
        @Override
        public void actionPerformed(java.awt.event.ActionEvent e) {
            System.out.println("aaa");
        }
    }
    
    • 多个按钮共享一个事件

      package base;
      
      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 ActionEvent02 {
          public static void main(String[] args) {
              //两个按钮实现同一个监听
              //开始 停止
              Frame frame = new Frame("开始-停止");
              Button button = new Button("start");
              Button button2 = new Button("stop");
              MyMonitor myMonitor = new MyMonitor();
              button.addActionListener(myMonitor);
              button2.addActionListener(myMonitor);
              frame.add(button,BorderLayout.EAST);
              frame.add(button2,BorderLayout.WEST);
              frame.setSize(400,400);
              frame.setVisible(true);
              windowClose(frame);
      
          }
          //关闭窗体的事件
          private static void windowClose(Frame frame){
              frame.addWindowListener(new WindowAdapter() {
                  @Override
                  public void windowClosing(WindowEvent e) {
                      System.exit(0);
                  }
              });
      
          }
      
      }
      
      class MyMonitor implements ActionListener{
          @Override
          public void actionPerformed(ActionEvent e) {
              System.out.println("按钮被点击了:"+ e.getActionCommand());
          }
      }
      
      
    • 输入框TextField监听

      package base;
      
      import java.awt.*;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      public class Test01 {
          public static void main(String[] args) {
              new MyFrame02();
          }
      }
      
      class MyFrame02 extends Frame{
          public MyFrame02(){
              TextField textField = new TextField();
              add(textField);
              MyActListener MyActListener = new MyActListener();
              //监听文本框输入的文字
              textField.addActionListener(MyActListener);
              //替换编码
              textField.setEchoChar('*');
              setVisible(true);
              pack();
          }
      }
      
      class MyActListener implements ActionListener{
          @Override
          public void actionPerformed(ActionEvent e) {
              TextField field = (TextField)e.getSource();//过得一些资源
              System.out.println(field.getText());//获得输入框中文本
              field.setText("");//回车后设置为空
          }
      }
      
      
    • 简易计算器+组合+内部类回顾

      package base;
      
      import java.awt.*;
      import java.awt.FlowLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      public class TestCalc {
          public static void main(String[] args) {
              new Calculator();
          }
      }
      
      //计算器类
      class Calculator extends Frame{
          public Calculator(){
              //3个文本框
              TextField field1 = new TextField(10);
              TextField field2 = new TextField(10);
              TextField field3 = new TextField(20);
              //一个按钮
              Button button = new Button("=");
              //按钮增加监听器
              button.addActionListener(new MyListener(field1,field2,field3));
              //1个标签
              Label label = new Label("+");
              //设置流式布局
              setLayout(new FlowLayout());
              add(field1);
              add(label);
              add(field2);
              add(button);
              add(field3);
              pack();
              setVisible(true);
      
          }
      }
      
      //监听器类
      class MyListener implements ActionListener{
      
          //获取三个变量
          private TextField field1;
          private TextField field2;
          private TextField field3;
      
          public MyListener(TextField field1,TextField field2,TextField field3){
              this.field1 = field1;
              this.field2 = field2;
              this.field3 = field3;
          }
      
          @Override
          public void actionPerformed(ActionEvent e) {
              //1.获得加数和被加数
              int n1 = Integer.parseInt(field1.getText());
              int n2 = Integer.parseInt(field2.getText());
              //2.+运算后赋值给第三个框
              field3.setText(""+(n1+n2));
              //3.清空输入参数
              field1.setText("");
              field2.setText("");
          }
      }
      
      

      面向对象写法

      package base;
      
      import java.awt.*;
      import java.awt.FlowLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      
      public class TestCalc {
          public static void main(String[] args) {
              new Calculator().loadFrame();
          }
      }
      
      //计算器类
      class Calculator extends Frame{
      
          TextField field1;
          TextField field2;
          TextField field3;
      
          public void loadFrame(){
              //3个文本框
              field1 = new TextField(10);
              field2 = new TextField(10);
              field3 = new TextField(20);
      
              System.out.println(field1);
              System.out.println(field2);
              System.out.println(field3);
              //一个按钮
              Button button = new Button("=");
              //按钮增加监听器
              button.addActionListener(new MyListener(this));
              //1个标签
              Label label = new Label("+");
              //设置流式布局
              setLayout(new FlowLayout());
              add(field1);
              add(label);
              add(field2);
              add(button);
              add(field3);
              pack();
              setVisible(true);
      
          }
      }
      
      //监听器类
      class MyListener implements ActionListener{
      
          //获取计算器这个对象,在一个类中组合另外一个类
          Calculator calculator = null;
      
          public MyListener(Calculator calculator){
              this.calculator = calculator;
          }
      
          @Override
          public void actionPerformed(ActionEvent e) {
              //1.获得加数和被加数
              int n1 = Integer.parseInt(calculator.field1.getText());
              int n2 = Integer.parseInt(calculator.field2.getText());
              //2.+运算后赋值给第三个框
              calculator.field3.setText(""+(n1+n2));
              //3.清空输入参数
              calculator.field1.setText("");
              calculator.field2.setText("");
          }
      }
      
      

      内部类实现 好处:能够畅通无阻的访问外部属性和方法

      package base;
      
      import java.awt.*;
      import java.awt.FlowLayout;
      import java.awt.event.ActionEvent;
      import java.awt.event.ActionListener;
      
      
      public class TestCalc {
          public static void main(String[] args) {
              new Calculator().loadFrame();
          }
      }
      
      //计算器类
      class Calculator extends Frame{
      
          TextField field1;
          TextField field2;
          TextField field3;
      
          public void loadFrame(){
              //3个文本框
              field1 = new TextField(10);
              field2 = new TextField(10);
              field3 = new TextField(20);
              //一个按钮
              Button button = new Button("=");
              //按钮增加监听器
              button.addActionListener(new MyListener());
              //1个标签
              Label label = new Label("+");
              //设置流式布局
              setLayout(new FlowLayout());
              add(field1);
              add(label);
              add(field2);
              add(button);
              add(field3);
              pack();
              setVisible(true);
      
          }
          //监听器类
          private class MyListener implements ActionListener{
      
              @Override
              public void actionPerformed(ActionEvent e) {
                  //1.获得加数和被加数
                  int n1 = Integer.parseInt(field1.getText());
                  int n2 = Integer.parseInt(field2.getText());
                  //2.+运算后赋值给第三个框
                  field3.setText(""+(n1+n2));
                  //3.清空输入参数
                  field1.setText("");
                  field2.setText("");
              }
          }
      }
      
      

      按Ctrl + O 快捷键

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rgSbsnG-1644999256590)(C:\Users\86177\AppData\Roaming\Typora\typora-user-images\1644982981238.png)]

    • 画笔

      package lesson01;
      
      import java.awt.*;
      
      public class PaintTest {
          public static void main(String[] args) {
              new MyPaint().loadFrame();
          }
      }
      
      class MyPaint extends Frame{
      
          public void loadFrame(){
              setVisible(true);
              setBounds(200,200,600,500);
          }
      
          @Override
          public void paint(Graphics g) {
              g.setColor(new Color(69, 117, 128));
              g.fillOval(100,100,100,100);
              g.fillRect(200,100,100,100);
          }
      }
      
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值