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

 

标签

 

原文地址:https://www.cnblogs.com/fire-dong/p/13414711.html