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("这是一个弹窗!"));
        }
    }

     

    标签

     

  • 相关阅读:
    (Java) LeetCode 275. H-Index II —— H指数 II
    (Java) LeetCode 82. Remove Duplicates from Sorted List II —— 删除排序链表中的重复元素 II
    前端知识体系目录
    PhoneGap/cordvoa如何添加Media插件
    使用Google Closure Compiler高级压缩Javascript代码注意的几个地方
    javascript中的函数式声明与变量式声明
    call,apply,bind的用法
    canvas学习笔记
    Cookie/Session机制详解
    架构师速成6.8-设计开发思路-领域驱动 分类: 架构师速成 2015-07-30 18:28 15人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/fire-dong/p/13414711.html
Copyright © 2011-2022 走看看