JavaSE基础——GUI编程(AWT)

GUI的核心技术:Swing和AWT(抽象窗口工具箱)

1、AWT

   1.1 组件和容器

   框架Frame :代码实现第一个窗口:

public class FrameDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("我的第一个窗口");//创建窗口对象
        frame.setSize(600,400);//设置窗口大小
        frame.setLocation(300,300);//设置窗口在屏幕的坐标
        frame.setBackground(Color.BLUE);//设置背景颜色
        frame.setVisible(true);//设置窗口可见
        frame.setResizable(true);//设置窗口不可变
    }
}

这个窗口没有设置关闭事件,只能最小化而不能关闭。
在这里插入图片描述
   面板panel: 将一个面板添加到窗口上。

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

/**
 * 将一个面板添加到窗口上,解决窗口不能关闭问题。
 */
public class PanelDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("MY FRAME");
        Panel panel = new Panel();//实例化面板的对象
        frame.setBounds(300,300,400,300);//设置窗口的大小和坐标
        frame.setBackground(Color.BLUE);
        frame.setResizable(true);//窗口大小不可变
        frame.setVisible(true);

        panel.setBounds(100,100,300,200);//设置面板的大小和坐标
        panel.setBackground(Color.WHITE);//设置面板的颜色

        frame.add(panel);//将面板添加到窗口上
        //添加窗口的监听事件,将窗口关闭
        frame.addWindowListener(new WindowAdapter() {
            //点击窗口的X将窗口关闭
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

   1.2 布局管理器

   (1)流式布局

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

/**
 * 流式布局
 */
public class FlowLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("流式布局窗口");
        frame.setBounds(100,100,400,400);
        frame.setBackground(Color.GREEN);
        frame.setVisible(true);
        //创建新的组件---按钮
        Button button1 = new Button("Button1");
        Button button2 = new Button("Button2");
        Button button3 = new Button("Button3");

        //将窗口设置为流式布局
        frame.setLayout(new FlowLayout(FlowLayout.TRAILING));

        //把按钮添加到窗口上
        frame.add(button1);
        frame.add(button2);
        frame.add(button3);

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }
}

执行结果:
在这里插入图片描述
   (2)东西南北中

import java.awt.*;

public class BorderLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("东西南北中");

        //创建按钮放置在窗口的东西南北中
        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");

        frame.add(east,BorderLayout.EAST);
        frame.add(west,BorderLayout.WEST);
        frame.add(south,BorderLayout.SOUTH);
        frame.add(north,BorderLayout.NORTH);
        frame.add(center,BorderLayout.CENTER);

        //设置窗口大小和可见
        frame.setSize(300,300);
        frame.setVisible(true);
    }
}

执行结果:
在这里插入图片描述

   (3)表格布局

import java.awt.*;

/**
 * 表格布局
 */
public class GridLayoutDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("表格布局");
        frame.setSize(600,400);
        //创建按钮
        Button button1 = new Button("Button1");
        Button button2 = new Button("Button2");
        Button button3 = new Button("Button3");
        Button button4 = new Button("Button4");
        Button button5 = new Button("Button5");
        Button button6 = new Button("Button6");

        //将窗口设置为表格布局
        frame.setLayout(new GridLayout(2,3));

        frame.add(button1);
        frame.add(button2);
        frame.add(button3);
        frame.add(button4);
        frame.add(button5);
        frame.add(button6);

        frame.pack();//窗口自适应
        frame.setVisible(true);
    }
}

执行结果:
在这里插入图片描述

小练习:实现如下图的窗口:
在这里插入图片描述
实现思路:
1、创建窗口为表格布局,设置2行1列 ;
2、创建四个面板,第一个和第三个为东西南北中布局,第二个第四个为表格布局;
3、在面板中添加按钮组件;
4、把面板2添加到面板1,把面板4添加到面板3;
5、面板1和面板3添加到窗口,完成了。

import java.awt.*;

public class Test {
    public static void main(String[] args) {
        Frame frame = new Frame("Test");
        frame.setLayout(new GridLayout(2,1));
        frame.setSize(600,500);
        //创建四个面板
        Panel panel1 = new Panel(new BorderLayout());
        Panel panel2 = new Panel(new GridLayout(2,1));
        Panel panel3 = new Panel(new BorderLayout());
        Panel panel4 = new Panel(new GridLayout(2,2));
        //面板1的左右分别添加上按钮
        panel1.add(new Button("Button"),BorderLayout.EAST);
        panel1.add(new Button("Button"),BorderLayout.WEST);
        //把Panel2设置为表格布局

        panel2.add(new Button("Button"),BorderLayout.NORTH);
        panel2.add(new Button("Button"),BorderLayout.SOUTH);
        //把面板2添加到面板1
        panel1.add(panel2,BorderLayout.CENTER);

        //panel3第一步在左右添加两个按钮

        panel3.add(new Button("Button"),BorderLayout.EAST);
        panel3.add(new Button("Button"),BorderLayout.WEST);

        //panel设置为两行两列的表格布局
        for (int i = 0; i < 4; i++) {
            panel4.add(new Button("Button"));
        }

        //把面板4添加到面板3
        panel3.add(panel4,BorderLayout.CENTER);

        //把面板1和面板3放进窗口
        frame.add(panel1);
        frame.add(panel3);
        frame.setVisible(true);
    }
}

执行结果:
在这里插入图片描述

   1.3 事件监听

   AWT事件处理机制的概要:

   ● 监听器对象是一个实现了特定监听器接口的类的实例。

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 ActionEventDemo {
    public static void main(String[] args) {
        Frame frame = new Frame("事件监听");
        frame.setSize(400,300);
        frame.setBackground(Color.BLUE);
        Button button = new Button("Button");
        button.addActionListener(new MyActionListener());
        frame.add(button);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}
/**
 * 事件监听类
 */
class MyActionListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("事件监听类");
    }
}

多个按钮监听同一个事件:

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

/**
 * 多个按钮,共享一个事件
 */
public class ActionListenerDemo2 {
    public static void main(String[] args) {
        Frame frame = new Frame("多个按钮共享一个事件");
        frame.setSize(400, 400);
        frame.setResizable(true);
        Button button1 = new Button("button-start");
        Button button2 = new Button("button-stop");
        //要被监听的事件
        MyActionListener2 myActionListener2 = new MyActionListener2();
        button1.addActionListener(myActionListener2);
        button2.addActionListener(myActionListener2);
        frame.add(button1,BorderLayout.EAST);
        frame.add(button2,BorderLayout.WEST);
        frame.add(button2);
        frame.pack();
        frame.setVisible(true);
    }
}

class MyActionListener2 implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按钮" + e.getActionCommand() + "被点击了");
        if (e.getActionCommand().equals("button-start")){
            System.out.println("start");
        }
    }
}

   1.4 输入框TextField监听

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 TextFieldDemo {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame();
    }
}

class MyFrame extends Frame {
    public MyFrame() {
        setSize(600,500);
        TextField textField = new TextField();//创建文本框
        this.add(textField);//将文本框添加到窗口
        MyActionListener3 myActionListener3 = new MyActionListener3();
        textField.addActionListener(myActionListener3);//给文本框添加监听事件
        textField.setEchoChar('*');//将输入的文本替换*
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyActionListener3 implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        TextField field = (TextField) e.getSource();
        System.out.println(field.getText());//打印输入框的文本
        field.setText(null);//获取一次清空一次
    }
}

在这里插入图片描述
在这里插入图片描述

练习:实现窗口计算器的加法

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 Test {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
    }
}

/**
 * 计算器类
 */
class Calculator extends Frame {
    public Calculator() {
        //先创建放加数和被加数以及计算结果的文本框
        TextField textField1 = new TextField(10);
        TextField textField2 = new TextField(10);
        TextField textField3 = new TextField(20);

        //创建一个等号的按钮
        Button button = new Button("=");
        //给等号添加监听事件
        button.addActionListener(new MyActionListener4(textField1, textField2, textField3));
        //创建加号标签
        Label label = new Label("+");

        //流式布局将这些组件添加到窗口
        setLayout(new FlowLayout());
        add(textField1);
        add(label);
        add(textField2);
        add(button);
        add(textField3);
        setVisible(true);
        pack();
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

/**
 * 监听类
 */
class MyActionListener4 implements ActionListener {
    private TextField num1, num2, num3;

    public MyActionListener4(TextField num1, TextField num2, TextField num3) {
        this.num1 = num1;
        this.num2 = num2;
        this.num3 = num3;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取加数和被加数
        int n1 = Integer.parseInt(num1.getText());
        int n2 = Integer.parseInt(num2.getText());
        int sum = n1 + n2;
        //给最后一个框添加计算结果
        String getsum = String.valueOf(sum);
        num3.setText(getsum);
        //把前两个框清空
        num1.setText("");
        num2.setText("");
    }
}

计算器窗口改进版:改为完全面向对象写法

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 ImproveDemo {
    public static void main(String[] args) {
        new Calculator2().loadName();
    }
}

/**
 * 计算器类
 */
class Calculator2 extends Frame {
    TextField num1;
    TextField num2;
    TextField num3;

    public void loadName() {
        num1 = new TextField(10);
        num2 = new TextField(10);
        num3 = new TextField(20);
        setSize(500, 500);
        setLayout(new FlowLayout());
        Label label = new Label("+");
        Button button = new Button("=");
        CalculatorListener calculatorListener = new CalculatorListener(this);
        button.addActionListener(calculatorListener);
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);
        setVisible(true);
        pack();
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

/**
 * 事件监听类
 */
class CalculatorListener implements ActionListener {
    //在监听类中创建计算器类对象,组合类
    Calculator2 calculator2 = null;

    public CalculatorListener(Calculator2 calculator2) {
        this.calculator2 = calculator2;
    }

    //获取加数被加数计算结果
    @Override
    public void actionPerformed(ActionEvent e) {
        int n1 = Integer.parseInt(calculator2.num1.getText());
        int n2 = Integer.parseInt(calculator2.num2.getText());
        int sum = n1 + n2;
        String sumText = String.valueOf(sum);
        calculator2.num3.setText(sumText);
        calculator2.num1.setText("");
        calculator2.num2.setText("");
    }
}

   1.5 画笔

import java.awt.*;

/**
 * 测试画笔
 */
public class PaintDemo {
    public static void main(String[] args) {
        new MyPaint().loadFrame();
    }
}

/**
 * 画笔类
 */
class MyPaint extends Frame {
    public void loadFrame(){
        setSize(400,400);
        setVisible(true);
    }
    @Override
    public void paint(Graphics g){
        g.setColor(Color.blue);
        g.fillOval(100,100,100,100);
        g.fillRect(200,200,200,200);
        g.setColor(Color.white);
    }
}

执行结果:
在这里插入图片描述

   1.6 鼠标监听:实现鼠标画画

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * 鼠标监听测试类
 */
public class MouseListenerDemo {
    public static void main(String[] args) {
        new MyFrame("鼠标画画");
    }
}

/**
 * 自己实现鼠标画画的类
 */
class MyFrame extends Frame {
    //用集合来存储鼠标点击的位置
    ArrayList points;

    public MyFrame(String title) {
        setBounds(200, 200, 400, 400);
        setVisible(true);
        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.GREEN);
            g.fillOval(point.x, point.y, 50, 50);
        }
    }

    //把这个点添加到界面上
    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();
        }
    }
}

   1.7 窗口监听:

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

/**
 * 窗口监听
 */
public class WindowDemo {
    public static void main(String[] args) {
        new WindowFrame();
    }
}
/**
 * 窗口类
 */
class WindowFrame extends Frame{
    public WindowFrame() {
        setBounds(300,300,400,500);
        setBackground(Color.green);
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            //关闭窗口
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("WindowClosing");
                System.exit(0);
            }
            //激活窗口
            @Override
            public void windowActivated(WindowEvent e) {
                WindowFrame frame = (WindowFrame) e.getSource();
                frame.setTitle("激活窗口");
                System.out.println("WindowActivated");
            }
        });
    }
}

在这里插入图片描述
   1.8 键盘监听:

import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * 测试键盘监听类
 */
public class KeyListenerDemo {
    public static void main(String[] args) {
        new KeyFrame();
    }
}

/**
 * 监听键盘类
 */
class KeyFrame extends Frame{
    public KeyFrame() {
        setBounds(200,200,400,400);
        setBackground(Color.GREEN);
        setVisible(true);
        addKeyListener(new KeyAdapter() {
            //获取当前按下的键盘的码
            @Override
            public void keyPressed(KeyEvent e) {
                int keyCode = e.getKeyCode();
                System.out.println(keyCode);
                if (keyCode == KeyEvent.VK_C){
                    System.out.println("You Pressed C Key");
                }
            }
        });
    }
}
发布了58 篇原创文章 · 获赞 7 · 访问量 2287

猜你喜欢

转载自blog.csdn.net/weixin_42492089/article/details/103340491