JAVA基础再回首(二十七)——JAVA中的图形化界面、GUI概述、简单的窗体创建、事件监听机制、动作事件、GUI布局、鼠标事件

JAVA基础再回首(二十七)——JAVA中的图形化界面、GUI概述、简单的窗体创建、事件监听机制、动作事件、GUI布局、鼠标事件

版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.youkuaiyun.com/m366917

这篇博客我们来说一下JAVA中的图形化界面,也就是GUI

GUI概述

英文全称是Graphical User Interface(图形用户接口)。用图形的方式,来显示计算机操作的界面,这样更方便更直观。

其实系统跟用户有两种交互,一种是GUI,一种叫做CLI。

CLI的英文全称是Command line User Interface (命令行用户接口)就是常见的Dos命令行操作。CLI需要我们记忆一些常用的命令,操作不直观。

Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中。我们来学习一下

  • java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
  • javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。

GUI继承体系图

这里写图片描述

从图中我们可以看到
Container常用子类:Window Panel(面板,不能单独存在。)
Window常用子类:Frame Dialog

下面我们就来写一个GUI的案例

简单的窗体创建

public class FrameDemo {
    public static void main(String[] args) {
        // 创建窗体对象
        Frame f = new Frame();

        // 设置窗体标题
        f.setTitle("GUI");
        // 设置窗体大小
        f.setSize(400, 300); // 单位:像素
        // 设置窗体位置
        f.setLocation(400, 200);

        // 调用一个方法,设置让窗体可见
        f.setVisible(true);
    }
}

运行结果
这里写图片描述

上面代码的设置窗体大小和位置方法我们可以用另外一个方法一句话搞定

public class FrameDemo {
    public static void main(String[] args) {
        // 创建对象
        Frame f = new Frame("GUI");
        // 一个方法搞定setBounds(x, y, width, height);
        f.setBounds(400, 200, 400, 300);

        f.setVisible(true);
    }
}

我们运行了程序后,发现窗口关不掉,只能关闭服务,窗口才能关闭。那么我们怎么实现点击关闭按钮关闭窗口呢,这就牵扯到了事件监听机制?下面我们就来学习

事件监听机制

  • 事件源
  • 事件
  • 事件处理
  • 事件监听器

    一个事件监听机制是由上面四个方面组成,下面我们来看事件监听机制流程图

    这里写图片描述

那么我们要关闭窗口的话,就要对窗体事件进行处理并监听

        // 让窗体关闭
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

动作事件

我们再来看按钮点击事件,首先我们要给窗体中添加一个按钮,然后再去实现他的点击事件

public class FrameDemo {
    public static void main(String[] args) {
        // 创建窗体对象
        Frame f = new Frame("添加按钮点击事件");
        // 设置属性
        f.setBounds(400, 200, 400, 300);
        // 设置布局为流式布局
        f.setLayout(new FlowLayout());

        // 创建按钮对象
        Button bu = new Button("我是按钮");
         bu.setSize(20, 10);

        // 把按钮添加到窗体
        f.add(bu);

        // 设置窗体可以关闭
        f.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        bu.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("点我点我!!");
            }
        });

        // 窗体显示
        f.setVisible(true);
    }
}

运行结果
这里写图片描述
我们每点一下按钮,控制台都会输出一句话。上面我们为窗体设置布局为流式布局,按钮才会在哪个位置,那么GUI布局还有那些呢?我们来看一下

GUI布局

  • FlowLayout(流式布局管理器)
    • 从左往右的顺序排列
    • Panel默认的布局管理器
  • BorderLayout(边界布局管理器)
    • 东南西北中
    • Frame默认的布局管理器
  • GridLayout(网格布局管理器)
    • 规则的矩阵
  • CardLayout(卡片布局管理器)
    • 选项卡
  • GridBagLayout(网格包布局管理器)
    • 非规矩的矩阵

鼠标事件

鼠标事件也很容易理解,就是当鼠标停留在按钮上就触发该事件,离开按钮后就触发另外一个事件,是不是很好玩,我们来玩一下

    button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                f.setBackground(Color.RED);
            }
        });

        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseExited(MouseEvent e) {
                f.setBackground(Color.WHITE);
            }
        });

运行程序后,在窗体中有一个按钮,当我们鼠标移动到按钮上面时,窗体的背景颜色会变成红色,离开时会变成白色,你可以自己试试,很好玩。感觉和在Android 中的代码有点相似
我们来看运行截图
这里写图片描述
这里写图片描述
截图看不见鼠标,但是效果还是没得说

好了,关于GUI图形化界面,我们就学习这么多,现在在开发中它不是我们掌握的重点,我们还是要了解一下的,当然他也有更加复杂的代码逻辑,如果想深入学习GUI,可以上网查询一下资料。就说这么多了。

欢迎有兴趣的同学加我朋友的QQ群:点击直接加群555974449 请备注:java基础再回首我们一起来玩吧

6.2.4 事件适配器 适配器类实现一个对应的所有接口,只是方法为空。 public abstract class WindowAdapter implements WindowListener { public void windowOpened(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} public void windowClosing(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} } 表6.1 Listener接口与对应的适配器(Adapter)类 接口名称 适配器名称 ComponentListener ComponentAdapter ContainerListener ContainerAdapter FocusListener FocusAdapter KeyListener KeyAdapter MouseListener MouseAdapter MouseMotionListener MouseMotionAdapter WindowListener WindowAdapter (7)鼠标运动事件 鼠标运动事件发生在鼠标移过某个组件时。 任何组件都可以产生这些事件,通过接口 MouseMotionListener 实现。 该接口有两个方法: mouseDragged(MouseEvent) mouseMove(MouseEvent) MouseMotionListener 没有自己的事件类型,替代它的是 MouseEvent 。 被用在 MouseEvent 对象上的方法它都可以使用: getClickCount( ) 返回鼠标被单击次数(整数) getPoint( ) 返回鼠标被单击位置的 x ,y 坐标 getX( ) 返回 x 位置 getY( ) 返回 y 位置 (8)窗口事件(WindowEvent) 窗口事件发生在用户打开或关闭一个诸如 Frame 或 Window 的窗口时。任何组件都可以产生这些事件,为了支持它们,类必须实现接口:WindowListener。 接口 WindowListener 中有七个方法: windowActivated(WindowEvent) 窗口被激活 windowClosed (WindowEvent) 窗口已关闭 windowClosing (WindowEvent) 窗口正在关闭 windowDeactivated (WindowEvent) 窗口失效 windowDeiconified (WindowEvent) 窗口正常化时 windowIconified (WindowEvent) 窗口最小化时 windowOpened (WindowEvent) 窗口被打开 (5)键盘事件(KeyEvent) 发生在键盘上的某个键被按下时。 类为了能够处理这些事件必须实现接口 KeyListener 。 每个产生一个键盘事件的组件上要调用方法 addKeyListener( ) 在接口 KeyListener 中有三个方法: public void keyPressed(KeyEvent evt) { //…… } public void keyReleased(KeyEvent evt) { //…… } public void keyTyped(KeyEvent evt) { //…… } 在 KeyEvent 对象上可以使用的方法: getKeyChar( ) 返回与事件相关的键盘字符的 Unicode 码 . . . . . . . . . . . . . .
一、设计要求 设计一个模拟仿真“生产者-消费者”问题的解决过程及方法的程序。 主要内容是P、V操作过程的设计与实现。生产消费者问题是操作系统设计中经常遇到的问题。多个生产者和消费者线程访问在共享内存中的环形缓冲。生产者生产产品并将它放入环形缓冲,同时消费者从缓冲中取出产品并消费。当缓冲区满时生产者阻塞并且当缓冲区有空时生产者又重新工作。类似的,消费者当缓冲区空时阻塞并且当缓冲区有产品时又重新工作。显然,生产者和消费者需要一种同步机制以协调它们的工作。 二、系统功能 本程序模拟实现了“生产者-消费者”问题的解决过程,用图形界面动态演示了P、V操作过程以及生产者、消费者进程之间的工作流程。 本程序使用的算法是典型的P、V操作使用信号量解决“生产者-消费者”问题。 本程序在界面上使用了Java的swing接口函数,用矩形条表示生产者进程中待生产的产品,并设置了三个分区分别表示生产者进程待生产的产品、公共缓冲池中已生产的产品和消费者进程已消费的产品,以动画的效果动态演示了待生产产品变成消费者进程中已消费产品的过程,以及在这一过程中生产者进程和消费者进程协调工作的过程。在程序运行过程中使用了两个生产者线程和两个消费者线程并发工作,并使用了线程随机休眠的策略,即每个线程在完成一次生产过程或消费过程后随机休眠1至10秒钟。这一策略能保证生产者和消费者之间的运行顺序被打破,从而产生生产产品和消费产品之间的矛盾(即没有产品可消费的情况下消费者试图向公共缓冲池取产品消费、公共缓冲池里的产品已满的情况下生产者试图生产产品放入缓冲池)。因为生产者生产产品和消费者消费产品都是随机的,所以产生的矛盾也是不可预知的,在这种情况下,才能检验所使用的算法是否健壮高效。而本程序正是基于这种思想设计出来的,用来模拟生产者消费者问题的解决过程。 本程序在运行时提供友好的交互界面,且操作简单,在模拟过程中各种情况有相应文字提示,并伴有相应的图像变化,如:当没有产品可消费的情况下消费者试图向公共缓冲池取产品消费,消费者进程阻塞,公共缓冲池随之变成红色,文字提示框内显示warning: it's empty!Consumer is block;当缓冲池已满而生产者试图生产产品并向缓冲池放入产品时,生产者进程阻塞,公共缓冲池里的每一个产品变成黄色,问题提示框显示warning: it's full!Producer is block。整个模拟过程通俗易懂,利于理解,能很好的帮助使用者加强生产者消费者问题的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值