zoukankan      html  css  js  c++  java
  • 狂神说Java个人笔记-GUI编程

    简介

    Gui的核心技术:swing AWT

    1.因为界面不美观

    2.需要jre环境!

    为什么我们要学习?

    1.可以写出自己心中想要的一些小工具

    2.工作时候,也可能需要维护到swing界面,概率极小!

    3.了解MVC架构,了解监听!

    AWT

    介绍

    1.包含了很多类和接口!GUI

    2.元素:窗口,按钮,文本框

    3.java.awt

    组件和容器

    1.Frame

    //GUI的第一个界面
    public static void main(String[] args) {
       //Frame JDK 看源码
       Frame frame = new Frame("我的第一个java图形界面窗口");
       //需要设置可见性
       frame.setVisible(true);
       //设置窗口大小
       frame.setSize(800,800);
       //设置背景颜色 Color
       frame.setBackground(new Color(32, 92, 9));
       //弹出的初始位置
       frame.setLocation(300,300);
       //设置大小固定
       frame.setResizable(false);
    }

    尝试设置多个窗口,继承Frame,利用封装。写个方法,然后调用类创建

    public class Demo2 {
       public static void main(String[] args) {
           MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.RED);
           MyFrame myFrame2 = new MyFrame(100, 300, 200, 200, Color.RED);
           MyFrame myFrame3 = new MyFrame(300, 100, 200, 200, Color.RED);
           MyFrame myFrame4 = new MyFrame(300, 300, 200, 200, Color.RED);

      }

    }
    class MyFrame extends Frame{
       static int id =0;//若设置多个窗口,用计数器
       public MyFrame(int x,int y,int w,int h, Color color){
           super("MyFrame"+(++id));
           setVisible(true);
           setBackground(color);
           setBounds(x,y,w,h);
           setResizable(false);
      }
    }

    2.面板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(18, 109, 62));
       //panel设置坐标背景颜色
       panel.setBounds(50,50,300,300);
       panel.setBackground(new Color(133, 25, 20));
       //frame.add(panel)
       frame.add(panel);
       frame.setVisible(true);
       //监听事件监听窗口关闭System.exit(0)
       //适配器模式
       frame.addWindowListener(new WindowAdapter() {
           //点击窗口关闭要做的事情
           @Override
           public void windowClosing(WindowEvent e) {
               //结束程序
               System.exit(0);
          }
      });
    }

    布局方法:

    • 流式布局

    • 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");
         Button button4 = new Button("button4");
         //设置为流式布局
         frame.setLayout(new FlowLayout());
         frame.setLayout(new FlowLayout(FlowLayout.LEFT));//从左开始流式布局
         frame.setLayout(new FlowLayout(FlowLayout.RIGHT));//从右开始流式布局
         frame.setBounds(100,100,500,500);
         //添加按钮
         frame.add(button1);
         frame.add(button2);
         frame.add(button3);
         frame.add(button4);
         frame.setVisible(true);

      }
    • 东西南北中

    • public static void main(String[] args) {
         Frame f = 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");
         f.add(east,BorderLayout.EAST);
         f.add(west,BorderLayout.WEST);
         f.add(south,BorderLayout.SOUTH);
         f.add(north,BorderLayout.NORTH);
         f.add(center,BorderLayout.CENTER);
         f.setSize(300,300);
         f.setVisible(true);
      }
    • 表格布局

    • public static void main(String[] args) {
         Frame f = 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");
         f.setLayout(new GridLayout(3,2));
         f.add(btn1);
         f.add(btn2);
         f.add(btn3);
         f.add(btn4);
         f.add(btn5);
         f.add(btn6);
         f.pack();//java函数!自动布局
         f.setVisible(true);
      }

      练习

      public static void main(String[] args) {
         Frame frame = new Frame("练习");
         //窗口设置
       frame.setBackground(Color.black);
       frame.setBounds(100,100,400,300);
       frame.setVisible(true);
       frame.setLayout(new GridLayout(2,1));
       //创建四个面板
         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,2));
         //创建1和2的button
         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);
         //创建3和4d1button
         p3.add(new Button("East-2"),BorderLayout.EAST);
         p3.add(new Button("West-2"),BorderLayout.WEST);
         p4.add(new Button("p4-btn-1"));
         p4.add(new Button("p4-btn-2"));
         p4.add(new Button("p4-btn-3"));
         p4.add(new Button("p4-btn-4"));
         p3.add(p4,BorderLayout.CENTER);


         //添加面板
         frame.add(p1);
         frame.add(p3);
         //关闭界面
         //监听事件监听窗口关闭System.exit(0)
         //适配器模式
         frame.addWindowListener(new WindowAdapter() {
             //点击窗口关闭要做的事情
             @Override
             public void windowClosing(WindowEvent e) {
                 //结束程序
                 System.exit(0);
            }
        });

      image-20200521172102136

      总结:

      1. Frame是一个顶级窗口

      2. Paner无法单独显示,必须添加到某个容器中。

      3. 布局管理器

    1.流式

    2.东西南北中

    3.表格

    4.大小,定位,背景颜色,可见性,监听。

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

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

    目前代码

     public static void main(String[] args) {
           //主程序
           new Calculator();
      }
    }
    //计算机类
    class Calculator extends Frame{


       public Calculator(){
           //三个文本框
           TextField num1 = new TextField(10);
           TextField num2 = new TextField(10);
           TextField num3 = new TextField(20);
           //一个button按钮
           Button button = new Button("=");
           button.addActionListener(new MyCalculator(num1,num2,num3)) ;

           //一个标签
           Label label = new Label("+");
           //布局
           setLayout(new FlowLayout());
           add(num1);
           add(label);
           add(num2);
           add(button);
           add(num3);
           pack();
           setVisible(true);
           addWindowListener(new WindowAdapter() {
               //点击窗口关闭要做的事情
               @Override
               public void windowClosing(WindowEvent e) {
                   //结束程序
                   System.exit(0);
              }
          });
      }
    }
    //监听器类
    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;

      }
       @Override
       public void actionPerformed(ActionEvent e) {
           //1.获得加数被加数
           Integer in1=Integer.parseInt(num1.getText());
           Integer in2=Integer.parseInt(num2.getText());
           //2.将值加法运算后放到第三框
           num3.setText(""+(in1+in2));
           //3.清除前两个框
           num1.setText("");
           num2.setText("");
      }
    }

     

    全面向对象写法

       public static void main(String[] args) {
            //主程序
            new Calculator();
        }
    }
    //计算机类
    class Calculator1 extends Frame{
        //属性:
        TextField num1,num2,num3;
        //方法
        public void loadFrame(){
            //三个文本框
           num1 = new TextField(10);
           num2 = new TextField(10);
           num3 = new TextField(20);
            //一个button按钮
            Button button = new Button("=");
            button.addActionListener(new MyCalculator1(this)) ;
    
            //一个标签
            Label label = new Label("+");
            //布局
            setLayout(new FlowLayout());
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            pack();
            setVisible(true);
            addWindowListener(new WindowAdapter() {
                //点击窗口关闭要做的事情
                @Override
                public void windowClosing(WindowEvent e) {
                    //结束程序
                    System.exit(0);
                }
            });
        }
        }
    
    //监听器类
    class MyCalculator1 implements ActionListener {
        //获取计算器对象 在一个类中组合另外一个类
        Calculator1 calculator1=null;
        public MyCalculator1(Calculator1 calculator1 ){
             this.calculator1=calculator1;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            //1.获得加数被加数
            Integer in1=(Integer.parseInt(calculator1.num1.getText()));
            Integer in2=(Integer.parseInt(calculator1.num2.getText()));
            //2.将值加法运算后放到第三框
            calculator1.num3.setText(""+(in1+in2));
            //3.清除前两个框
           calculator1.num1.setText("");
           calculator1.num2.setText("");
        }
    }

     

    内部类

      public static void main(String[] args) {
            new Calculator2();
        }
    }
    class Calculator2 extends Frame{
        //属性   三个文本框 一个button 一个标签
        TextField num1,num2,num3;
        Button button;
        Label label;
        //方法
        public void loginFrame(){
            num1=new TextField(10);
            num2=new TextField(10);
            num3=new TextField(20);
            button=new Button("=");
            button.addActionListener(new CaclActionListener());
            label=new Label("+");
            //布局
            setLayout(new FlowLayout());//流式布局
            add(num1);
            add(label);
            add(num2);
            add(button);
            add(num3);
            pack();//自动优化布局
            setVisible(true);
        }
        private class CaclActionListener implements ActionListener{
    
            @Override
            public void actionPerformed(ActionEvent e) {
                //获取加数被加数
                Integer in1=Integer.parseInt(num1.getText());
                Integer in2=Integer.parseInt(num2.getText());
                //将加法运算后方到第三个
                num3.setText(""+(in1+in2));
                //清空前两个框
                num1.setText("");
                num2.setText("");
            }
        }
    }

    内部类最大特点:可以畅通无阻的访问外部类的方法,属性

    画笔

      public static void main(String[] args) {
            new MyPaint().loadFrame();
        }
    }
    class MyPaint extends Frame{
        public void loadFrame(){
            setBounds(200,200,600,500);
            setVisible(true);
           addWindowListener(new WindowAdapter() {
                //点击窗口关闭要做的事情
                @Override
                public void windowClosing(WindowEvent e) {
                    //结束程序
                    System.exit(0);
                }
            });
        }
        //画笔
        @Override
        public void paint(Graphics g){
            //画笔,需要有颜色,画笔可以画画
            //g.drawOval(100,100,100,100);
            g.fillOval(100,100,100,100);//实心圆
            g.setColor(Color.GREEN);
            g.fillRect(150,200,200,200);
            //画笔用完,将他还原到最初的颜色
        }
    }

     

    鼠标监听

    package com.dong.gui.lestion;
    
    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.Iterator;
    
    /**
     * @author dong
     * @date 2020/5/22 - 15:27
     */
    public class TestMouseListener {
        //鼠标监听事件
        public static void main(String[] args) {
            new MyFrame("画图");
        }
    }
    //自己的类
    class MyFrame extends Frame{
        //画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点
        ArrayList points;
        public MyFrame(String title){
            super(title);
            setBounds(200,200,400,300);
            //存鼠标点击的点
            points=new ArrayList<>();
            //鼠标监听器,针对当前窗口
            this.addMouseListener(new MyMouseListener());
        }
    
        @Override
        public void paint(Graphics g) {
           //画画,监听鼠标的时间
            Iterator iterator=points.iterator();
            while(iterator.hasNext()){
                Point point= (Point) iterator.next();
                g.setColor(Color.BLUE);
                g.fillOval(point.x,point.y,10,10);
            }
        }
        //添加一个点到界面上
        public void addPaint(Point point){
            points.add(point);
        }
        //适配器模式
        private class MyMouseListener extends MouseAdapter{
            //鼠标按下,弹起,按住不放
    
            @Override
            public void mousePressed(MouseEvent e) {
                MyFrame frame= (MyFrame) e.getSource();
                //我们点击的时候,就会在界面上产生一个点!
                //这个点就是鼠标的点:
                frame.addPaint(new Point(e.getX(),e.getY()));
                //每次点击鼠标都需要重新画一遍
                frame.repaint();//刷新
            }
        }
    }

     

    窗口监听

    public class TestWindow {
        public static void main(String[] args) {
            new WindowFrame();
        }
    }
    class WindowFrame extends Frame{
        public WindowFrame() {
            setBackground(Color.GREEN);
            setBounds(100,100,200,200);
            setVisible(true);
            this.addWindowListener(
                    //匿名内部类
                    new WindowAdapter() {
                        //关闭窗口
                        @Override
                        public void windowClosing(WindowEvent e) {
                            System.exit(0);
                        }
                        //激活窗口
    
                        @Override
                        public void windowActivated(WindowEvent e) {
                            WindowFrame source = (WindowFrame) e.getSource();
                            source.setTitle("已激活");
                            System.out.println("windowActivated");
                        }
                    }
            );
    
        }
    
    }

     

    ###

    键盘监听

    public class TestKey {
        public static void main(String[] args) {
    
        }
    }
    class KeyFrame extends Frame{
        public KeyFrame(){
            setBounds(100,100,400,400);
            setVisible(true);
            this.addKeyListener(new KeyAdapter() {
                @Override
                public void keyPressed(KeyEvent e) {
                    int keyCode=e.getKeyCode();//使用静态属性
                    System.out.println(keyCode);
                    if(keyCode==KeyEvent.VK_UP){
                        System.out.println("你按了上键");
                    }
                }
            });
        }
    }

     

    3.Swing 对AWT的演化

     public void init(){
            //顶级窗口
            JFrame jf = new JFrame("这是个JFrame窗口");
            jf.setBounds(100,100,200,200);
            jf.setVisible(true);
            //设置文字Jlable
            JLabel label = new JLabel("欢迎来到我的设计");
            jf.add(label);
            //让文本标签居中 设置水平对齐
            label.setHorizontalAlignment(SwingConstants.CENTER);
            //关闭事件
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            //创建一个容器,颜色更改在容器里
            Container contentPane = jf.getContentPane();
            contentPane.setBackground(Color.GREEN);
        }
        public static void main(String[] args) {
            //建立一个窗口!
            new JFrameDemo().init();
        }
    }
    
    
    

     

    弹窗

    JDialog,用来被弹出,默认就有关闭事件!

    //主窗口
    
    public class DialogDemo extends JFrame {
        public DialogDemo(){
            this.setSize(700,500);
            this.setVisible(true);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            //JFrame放东西,容器
            Container container=this.getContentPane();
            //绝对布局
            container.setLayout(null);
            //按钮
            JButton button = new JButton("点击弹出一个对话框");
            button.setBounds(30,30,200,50);
            //点击这个按钮的时候,弹出一个弹窗
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    //弹窗
                    new MyDialogDemo();
                }
            });
            container.add(button);
        }
    
        public static void main(String[] args) {
            new DialogDemo();
        }
    }
    //弹窗的窗口
    class MyDialogDemo extends JDialog{
        public MyDialogDemo() {
            this.setVisible(true);
            this.setBounds(100,100,500,500);
            Container container=this.getContentPane();
            container.setLayout(null);
            container.add(new Label("这是一个弹窗!"));
        }
    }

     

    标签

     

  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/fire-dong/p/13414711.html
Copyright © 2011-2022 走看看