GUI 学习 (SWING,AWT)

(可能注解文字比较少,代码比较多,因为大部分都写在注解里了)

视频链接

学习目的

重点在于学习一下监听机制

  1. 写一些自己喜欢的小工具
  2. 维护swing界面
  3. 了解MVC架构,了解监听
  4. 回顾一下java语法康复训练

AWT

  1. 介绍

    包含了很多类和接口

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

    包:java.awt

    架构图

    2.2

AWT架构图.png

2.3 Frame

package gui.lesson1;

import java.awt.*;

//gui 第一个界面
public class testfram {
    public static void main(String[] args){
        //Frame
        Frame test1=new Frame("my first java Figure Window");

        //设置可见性
        test1.setVisible(true);

        //设置窗口大小

        test1.setSize(400,400);

        //设置背景颜色

        test1.setBackground(Color.BLACK);

        //弹出的初始位置
        test1.setLocation(200,200);

        //设置大小固定
        test1.setResizable(false);
    }

}

2.4 Panel

package gui.lesson1;


import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

//可以看成空间
public class Test_panel {
    public static void main(String[] args) {
        Frame frame=new Frame();
        //布局
        Panel panel =new Panel();



        //设置布局
        frame.setLayout(null);
        //  坐标
        frame.setBounds(300,300,500,500);

        //
        frame.setBackground(Color.green);

        panel.setBounds(50,50,400,400);

        panel.setBackground(Color.red);

        frame.add(panel);

        frame.setVisible(true);

        //监听关闭事件
        //  e
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

}

2.5布局管理器

  • 流式布局

  • 东西南北中

  • 表格布局

2.6 事件监听 :监控某件事情

可以多个按钮实现同一个监听

利用actionCommand 增加命令属性,

在监听的时候进行判断

2.7 输入框Test FIeld

package gui_lesson2;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test_text {
    public static void main(String[] args) {

        Myf myf = new Myf();
        myf.setVisible(true);
        myf.pack();
    }
}

//设置个人面板来进行个性化设置
class Myf extends Frame {
    public Myf() {
        TextField textField = new TextField();
        //这个是文本框
        add(textField);
        //下面的只是监听器
        myac a = new myac();
        //按下输入框默认成为事件

        //设置编码
        textField.setEchoChar('*');
        textField.addActionListener(a);
        setBounds(200, 200, 200, 200);
    }
}

class myac implements ActionListener {
//继承一个事件监听器接口
    @Override
    //可以在这里设置一些对事件的操作内容
    public void actionPerformed(ActionEvent e) {
        //因为在测试文本框所以,类型强制转换为文本框类
        TextField file = (TextField) e.getSource();//获取对应资源
        System.out.println(file.getText());//输出文本框获得的文本
        //回车之后清空输入框
        file.setText("");
    }
}

2.7 应用---->简易计算器

oop原则:组合大于继承

面向过程和面向对象(两种)

package gui_lesson3;

import javax.imageio.plugins.tiff.TIFFTagSet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;

//主函数
public class Test_calc {
    public static void main(String[] args) {
    Calcu calcu = new Calcu();

    }
}

//设置计算器类
class Calcu extends Frame{

    //属性
    TextField nu1;
    TextField nu2;
    TextField nu3;
    Button bn;
    Label label;
    //方法


    public Calcu(){
        //三个文本框
         nu1 =new TextField(10);//字符数
         nu2 =new TextField(10);//字符数
         nu3 =new TextField(10);//字符数
        //一个按钮
         bn  = new Button("=");
         bn.addActionListener(new mycalclis(this));
        //一个标签
        label = new Label("+");
        //布局
        setLayout(new FlowLayout());
        add(nu1);
        add(label);
        add(nu2);
        add(bn);
        add(nu3);
        setVisible(true);
        pack();
        setBounds(200,200,200,200);

    }
}
//监听器类
class mycalclis implements ActionListener{
    //获取三个变量的两种方法
    //常规方法
   /* private TextField nu1,nu2,nu3;
    public mycalclis(TextField nu1,TextField nu2,TextField nu3){
        this.nu1=nu1;
        this.nu2=nu2;
        this.nu3=nu3;
    }
*/
    //简便方法
    //获取计算器整个类---->>组合
    Calcu calcu =null;
    public mycalclis(Calcu calcu){
        this.calcu=calcu;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //获得加数
        /*
        int n1=Integer.parseInt(nu1.getText());
        int n2=Integer.parseInt(nu2.getText());
*/
        int n1=Integer.parseInt(calcu.nu1.getText());
        int n2=Integer.parseInt(calcu.nu2.getText());
        //输出第三个结果
        calcu.nu3.setText(""+(n1+n2));
        //清除两个框
        calcu.nu1.setText("");
        calcu.nu2.setText("");
    }
}

可以设置内部类

把监听器作为计算器的内部类 就可以直接实现内部传参数;

最大的好处,直接使用外部类参数

//设置计算器类
class Calcu extends Frame{
    //属性
    TextField nu1;
    TextField nu2;
    TextField nu3;
    Button bn;
    Label label;
    //方法

    public Calcu(){
        //三个文本框
         nu1 =new TextField(10);//字符数
         nu2 =new TextField(10);//字符数
         nu3 =new TextField(10);//字符数
        //一个按钮
         bn  = new Button("=");
         bn.addActionListener(new mycalclis());
        //一个标签
        label = new Label("+");
        //布局
        setLayout(new FlowLayout());
        add(nu1);
        add(label);
        add(nu2);
        add(bn);
        add(nu3);
        setVisible(true);
        pack();
        setBounds(200,200,200,200);

    }
    class mycalclis implements ActionListener{
        //获取三个变量的两种方法
        //常规方法
   /* private TextField nu1,nu2,nu3;
    public mycalclis(TextField nu1,TextField nu2,TextField nu3){
        this.nu1=nu1;
        this.nu2=nu2;
        this.nu3=nu3;
    }
*/
        //简便方法
        //获取计算器整个类---->>组合
        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数
        /*
        int n1=Integer.parseInt(nu1.getText());
        int n2=Integer.parseInt(nu2.getText());
*/
            int n1=Integer.parseInt(nu1.getText());
            int n2=Integer.parseInt(nu2.getText());
            //输出第三个结果
            nu3.setText(""+(n1+n2));
            //清除两个框
            nu1.setText("");
            nu2.setText("");
        }
    }

}

Swing

init初始化操作

(标签居中)

package lesson_4;

import javax.swing.*;
import java.awt.*;

public class JFrameDemo {
    public void init(){
        //顶级窗口
        JFrame frameDemo=new JFrame();
        frameDemo.setVisible(true);
        frameDemo.setBounds(100,100,200,200);
        //设置文字
        JLabel label = new JLabel("Jesus");
        frameDemo.add(label);
        //让文本居中
        label.setHorizontalAlignment(SwingConstants.CENTER);
        //容器实例化
        Container container = frameDemo.getContentPane();
        //关闭事件
    frameDemo.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        //建立一个窗口
        new JFrameDemo().init();
    }
}


弹窗

package lesson_4;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Bounds extends JFrame {
    public  Bounds(){
        setVisible(true);
        setSize(700,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        Container container =this.getContentPane();


        //绝对布局
        container.setLayout(null);

        //按钮
        JButton button = new JButton("bounds");
        button.setBounds(30,30,200,50);
        container.add(button);

        //点击按钮的时候弹出一个弹窗

        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //弹窗
                new mydialog();

            }
        });
    }

    public static void main(String[] args) {
        Bounds bounds = new Bounds();
    }
}

//编写弹窗
class mydialog extends JDialog{
   //Ctrl+o 快速重写父类方法
    //不要乱用void
    public  mydialog(){
        setBounds(100,100,500,500);
        this.setVisible(true);

        Container container =  this.getContentPane();
        container.setLayout(null);
        container.add(new Label("what"));
    }
}

此处省略了许多其他内容,但是无需深入学习,毕竟GUI已经退出舞台了 后期如有需要,可以再临时学一下对应语法

总结

虽然拖了很久,但还是学到了不少

浅学一下监听机制,为后期的框架学习做一点准备

GUI.png

最近有点懈怠了,需要警醒一下自己

文章作者: P4ul
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 打工人驿站
后端 java
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝