Java语言程序设计——篇十五(1)

news2024/9/24 21:28:59

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

       🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

在这里插入图片描述

事件处理

  • 事件处理
    • 事件处理模型
    • 事件类和事件类型
    • 使用事件处理器
        • 实战演练
    • 常用事件类型
      • (1)动作事件ActionEvent
        • 实战演练
      • 2)鼠标事件MouseEvent
        • 实战演练
      • (3)键盘事件KeyEvent
        • 实战演练

事件处理

  • 事件处理:为控件设计相应的程序,使控件能够响应并处理用户的操作。
  • Java程序一旦构建完GUI,就不再工作,而是等待用户通过鼠标、键盘给它通知,它再根据这个通知的内容进行相应的处理 (事件处理)
  • 通常一个键盘或鼠标操作会引发一个系统预先定义好的事件 (事件类) ,用户只需编写代码,定义每个特定事件发生时程序应做出何种响应即可。

事件处理模型

  • JavaFX事件处理采用事件代理模型(委托事件模型):将事件源和对事件做出的具体处理分离开来。将事件的处理从事件源对象代理给一个或多个成为事件处理器或事件监听器的对象,事件由事件处理器处理。
  • 事件处理模型涉及3种对象:事件源、事件和事件处理器(监听者):
    (1)事件源(event source):能够产生事件的对象。如按钮、鼠标、文本框、键盘等。当这些对象的状态改变时,就会产生事件。
    (2)事件(event):一个事件是事件类的实例,描述事件源状态的改变。
    (3)事件处理器(handler):接收事件并对其进行处理的对象。该对象必须实现EventHandler接口。处理器有专门的方法来处理事件,事件处理器是一个对事件源进行监视的对象,当事件源上发生事件时,事件处理器能够监听到,并调用相应的方法对发生的事件做出相应的处理。
  • JavaFX的事件处理模型如图所示:
    在这里插入图片描述
  • 例如,当按钮被鼠标单击时,会触发一个“动作事件”(Action event),JavaFX程序就会产生一个“事件对象”来表示这个事件,然后把这个“事件对象”传递给“事件处理器”,“事件处理器”再依据“事件对象”的种类把工作指派给事件处理者,即事件处理程序。在这里按钮就是一个事件源。
  • 为了让“事件源”(如按钮)知道要把事件信息传递给哪一个“事件处理器”,事先必须把“事件处理器”向“事件源”注册(register),这个操作也就是告知“事件源”要把事件信息传递给它。
  • 事件代理模型的工作原理: 在这里插入图片描述
    总结:
      要处理事件,首先在事件源上注册事件处理器。当用户动作触发一个事件,运行时系统将创建一个事件对象,然后执行事件处理器对象。

事件类和事件类型

  • JavaFX定义了大量事件类用于处理各种用户操作所产生的事件,这些类封装了事件对象。在Java语言中,Java事件类的根是java.util.EventObjectJavaFX事件类的根是javafx.event.Event
  • 常用事件类的层次关系如下图:
    在这里插入图片描述
  • 事件类型是javafx.event.EventType类的实例,它表示与事件相关的具体类型。事件类型还可进一步分为单个的事件类。
  • 如KeyEvent类就包含下面的事件类型:

KeyEvent.KEY_PRESSED:键被按下。
KeyEvent.KEY_RELEASED:键被释放。
KeyEvent.KEY_TYPED:键被按下,然后释放

  • MouseEvent类包含10多个具体事件,下面是几个常用的:

MouseEvent.MOUSE_CLICKED,鼠标单击。
MouseEvent.MOUSE_ENTERED ,鼠标进入控件。
MouseEvent.MOUSE_PRESSED,按下鼠标左键。
MouseEvent.MOUSE_MOVED,鼠标指针移动。

使用事件处理器

  • 担当事件源的事件处理器,需满足两个条件:
    (1)事件处理器必须是一个对应的事件处理器接口的实例。
    (2)事件处理器对象必须通过事件源进行注册,注册方法依赖于事件类型。
  • 注册事件处理器的两种方法:
    (1)使用控件提供的方便方法。教材中表15-2给出常用事件类型、用户动作和事件注册方法。
    (2)使用Node类的addEventHandler()的方法,该方法带一个事件类型参数和一个EventHandler参数。
    1.使用控件提供的方便方法来注册事件处理器,不同的事件注册方法不同。例如:
    ①对于ActionEvent事件,注册方法是
   setOnAction(EventHandler<ActionEvent> handler)

②对于鼠标单击事件,注册方法是

setOnMouseClicked(EventHandler<MouseEvent> handler)

③对于一个按键事件,注册方法是

setOnKeyPressed(EventHandler<KeyEvent> handler);

2.使用Node类的addEventHandler()的方法:
  JavaFX定义了一个对于事件T的统一的处理器接口EventHandler<T extends Event>,该接口中声明了handle(T e)方法用于处理事件。例如:
   对于ActionEvent事件,处理器接口是EventHandler(ActionEvent),应该实现handle(ActionEvente)方法处理事件。
实现事件处理器对象和注册事件处理器的三种方法:
(1)通过内部类对象实现;
(2)通过匿名内部类实现;
(3)使用Lambda表达式实现。

实战演练

例:下面代码使用匿名类创建一个处理器对象,处理鼠标事件,并为节点注册事件处理器。

//定义事件处理器handler 
EventHandler handler = new EventHandler<MouseEvent>() {
      public void handle(MouseEvent event) {
               System.out.println("处理事件:" + event.getEventType());}};
//为节点注册处理器handler1) myNode.setOnMouseClicked(handler);2)myNode.addEventHandler(MouseEvent.MOUSE_CLICKED,
                          handler);

常用事件类型

(1)动作事件ActionEvent

  • ActionEvent是表示某种动作的事件,如按钮被点击、菜单项被选择,都发生这种类型事件。
  • 使用控件的setOnAction()方法,一般格式为:
void setOnAction(EventHandler<ActionEvent> value)//事件处理器对象
  • 使用Node类定义的addEventHandler()方法注册事件处理器:
    void addEventHandler(ActionEvent eventType,
                  EventHandler<ActionEvent> handler)
实战演练

问题描述:
编写程序,实现如图所示的界面。要求当单击“确定或“取消”按钮时,在标签中显示相应信息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例:使用Lambda表达式实现处理器

 public class ActionEventDemo extends Application {
       Label label = new Label();
       Button ok = new Button("确定"), cancel = new Button("取消");
       @Override
       public void start(Stage stage) {
       ok.setOnAction((ActionEvent event)->label.setText("你单击了'确定'按钮"));
   cancel.setOnAction((ActionEvent event)->label.setText("你单击了'取消'按钮"));
	FlowPane rootNode = new FlowPane(10, 10);
	rootNode.setAlignment(Pos.CENTER);
	rootNode.getChildren().addAll(ok, cancel, label);
	Scene scene = new Scene(rootNode, 240, 100);
	stage.setTitle("事件处理示例");
	stage.setScene(scene);
	stage.show();
     }
        public static void main(String[] args) {
		launch(args);
    }
}

2)鼠标事件MouseEvent

  • 当鼠标按键在一个节点上或者一个场景中被按下、释放、单击、移动或者拖动时,一个MouseEvent事件被触发。
  • MouseEvent类的常用方法:

MouseButton getButton()//结果是MouseButton枚举值。PRIMARY、MIDDLE、SECONDARY。
例:me.getButton()==MouseButton.SECONDARY
int getClickCount()
double getX()
double getY()
double getScreenX()
double getScreenY()

可以使用setOnMouseEntered()、setOnMouseExited()和setOnMousePressed()等方法为鼠标事件注册事件处理器。

实战演练

问题描述:
编写程序,如图所示。当鼠标进入圆、离开圆、在圆中按键,在标签中显示相关信息,当鼠标指针处于圆中并拖动,圆在新的位置显示。

import javax.swing.*;  
import java.awt.*;  
import java.awt.event.*;  
  
public class CircleApp extends JFrame {  
    private JLabel statusLabel;  
    private int circleX = 100;  
    private int circleY = 100;  
    private int circleRadius = 50;  
  
    public CircleApp() {  
        setTitle("Circle App");  
        setSize(400, 400);  
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        setLayout(null);  
  
        statusLabel = new JLabel("Mouse outside the circle");  
        statusLabel.setBounds(10, 10, 380, 20);  
        add(statusLabel);  
  
        addMouseListener(new MouseAdapter() {  
            @Override  
            public void mousePressed(MouseEvent e) {  
                if (isInsideCircle(e.getX(), e.getY())) {  
                    statusLabel.setText("Mouse pressed inside the circle");  
                }  
            }  
  
            @Override  
            public void mouseReleased(MouseEvent e) {  
                if (isInsideCircle(e.getX(), e.getY())) {  
                    statusLabel.setText("Mouse released inside the circle");  
                }  
            }  
  
            @Override  
            public void mouseEntered(MouseEvent e) {  
                if (isInsideCircle(e.getX(), e.getY())) {  
                    statusLabel.setText("Mouse entered the circle");  
                }  
            }  
  
            @Override  
            public void mouseExited(MouseEvent e) {  
                statusLabel.setText("Mouse outside the circle");  
            }  
        });  
  
        addMouseMotionListener(new MouseMotionAdapter() {  
            @Override  
            public void mouseDragged(MouseEvent e) {  
                if (isInsideCircle(e.getX(), e.getY())) {  
                    circleX = e.getX() - circleRadius;  
                    circleY = e.getY() - circleRadius;  
                    repaint();  
                }  
            }  
        });  
    }  
  
    private boolean isInsideCircle(int x, int y) {  
        return Math.sqrt(Math.pow(x - circleX - circleRadius, 2) + Math.pow(y - circleY - circleRadius, 2)) <= circleRadius;  
    }  
  
    @Override  
    public void paint(Graphics g) {  
        super.paint(g);  
        g.drawOval(circleX, circleY, 2 * circleRadius, 2 * circleRadius);  
    }  
  
    public static void main(String[] args) {  
        SwingUtilities.invokeLater(() -> {  
            CircleApp frame = new CircleApp();  
            frame.setVisible(true);  
        });  
    }  
}

(3)键盘事件KeyEvent

  • 在一个节点或者一个场景上按下、释放或者敲击键盘按钮,就会触发一个KeyEvent事件。
  • KeyEvent类的常用方法:

String getCharacter()
String getText()
KeyCode getCode()
boolean isShiftDown()

使用节点的setOnKeyPressed()、setOnKeyReleased()和setOnKeyTyped()等方法为键盘事件注册事件处理器。

实战演练

问题描述:
编写程序,如图所示。按字母键显示不同字母,按方向键,字母移动。

import javafx.application.Application;  
import javafx.scene.Scene;  
import javafx.scene.input.KeyCode;  
import javafx.scene.layout.StackPane;  
import javafx.scene.paint.Color;  
import javafx.scene.shape.Rectangle;  
import javafx.scene.text.Font;  
import javafx.scene.text.Text;  
import javafx.stage.Stage;  
  
public class KeyboardEventsExample extends Application {  
  
    private Text text = new Text(50, 50, "A");  
    private double x = 50, y = 50;  
  
    @Override  
    public void start(Stage primaryStage) {  
        Rectangle background = new Rectangle(400, 400, Color.WHITE);  
        StackPane root = new StackPane();  
        root.getChildren().addAll(background, text);  
  
        Scene scene = new Scene(root, 400, 400);  
  
        scene.setOnKeyPressed(event -> {  
            KeyCode keyCode = event.getCode();  
            switch (keyCode) {  
                case UP:  
                    y -= 10;  
                    text.setY(y);  
                    break;  
                case DOWN:  
                    y += 10;  
                    text.setY(y);  
                    break;  
                case LEFT:  
                    x -= 10;  
                    text.setX(x);  
                    break;  
                case RIGHT:  
                    x += 10;  
                    text.setX(x);  
                    break;  
                default:  
                    text.setText(keyCode.toString().substring(0, 1));  
                    break;  
            }  
        });  
  
        primaryStage.setTitle("JavaFX Keyboard Event Example");  
        primaryStage.setScene(scene);  
        primaryStage.show();  
    }  
  
    public static void main(String[] args) {  
        launch(args);  
    }  
}

博主用心写,读者点关注,互动传真情,知识不迷路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8s节点状态 NotReady排查

k8s节点由 Ready变成 NotReady izbp12ghzy6koox6fqt0suz NotReady slave 97d v1.23.3 izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3节点进入 NotReady 状态可能是由于多种原因引起的&#xff0c;尤其是在资源过量分配&am…

CSS+JS实现一个鼠标移动的高亮边框效果

一、过程分析 先上效果&#xff1a; 在Windows系统里有一个很棒的细节效果&#xff0c;元素的渐变高亮边框是可以感知鼠标的&#xff0c;边框的高亮部分会跟随鼠标的移动而移动。 这种效果也是比较常见的&#xff0c;但是实现起来还是需要一点时间和思路的。 首先&#xff0…

花裤衩 vue 前后端登录

从官网复制地址, idea中打开打开后输入 npm i 编译下载修改配置 找到 vue.config.js打开后,找到第39行 删除代码, 把可粘贴粘上 可粘贴: proxy: { [process.env.VUE_APP_BASE_API]: { target: http://127.0.0.1:18080, changeOrigin: true, pathRewrite…

使用托管竞价实例在Amazon SageMaker上运行机器学习训练

这是本系列文章的第二篇&#xff0c;旨在通过动手实践&#xff0c;帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章&#xff0c;大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧&#xff01; 介绍 什么是Amazon SageMaker …

ant design pro access.ts 是如何控制多角色的权限的

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二 看上面的图片&#xff0c;在前端中如何控制这些权限&#xff0c;比如控制按钮的显示&#xff0c;还有菜单…

Stable diffusion模型分几种?一文详解,入门必看!

在Stable Diffusion中&#xff0c;模型并不只有一种&#xff0c;不同插件有不同的模型&#xff0c;分别作用于不同的功能。今天就带大家一起来学习一下&#xff5e; 01 大模型 也就是stable diffusion模型&#xff0c;在默认界面中&#xff0c;它位于web页面的左上角&#x…

[数据结构] RBTree 模拟实现RBTree

标题&#xff1a;[数据结构] RBTree && 模拟实现RBTree 水墨不写bug 目录 一、红黑树的概念 二、map和set的封装 三、红黑树的实现 1、红黑树节点的定义 2、红黑树的结构 3、红黑树的插入 1.名称 2.插入节点的颜色 红黑树的insert 实现 情况一&#xff1a;不…

微信自动化管理了解下

微信作为一款广泛使用的社交软件&#xff0c;已经成为人们日常生活中不可或缺的通讯工具。不仅个人用户频繁使用&#xff0c;许多企业也依赖微信进行业务沟通和客户服务。 然而&#xff0c;对于企业用户来说&#xff0c;管理多个微信账户往往带来诸多繁琐和不便之处。这些问题…

Django+anaconda

一、搭建django虚拟环境 打开anaconda prompt 输入&#xff1a;conda create -n mydjango_env 判断&#xff08;y/n&#xff09;:y 查看虚拟环境 conda env list *号表示当前使用的环境 激活创建的虚拟环境 activate mydjango_env 二、安装Django 在新环境激活的状态下安装…

Nature|通过范德华层压实现三维单片集成系统 (半导体器件/集成电路)

2024年5月22日,湖南大学刘渊(Yuan Liu)教授课题组,在《Nature》上发布了一篇题为“Monolithic three-dimensional tier-by-tier integration via van der Waals lamination”的论文。第一作者为湖南大学物理与微电子科学学院陆冬林(Donglin Lu)博士。论文内容如下: 一、 …

Stable Diffusion 的采样器

一图 不推荐使用的采样器 PLMS LMS LMS Karras DPM fast DPM2 DPM2a DPM2 Karras DPM2 a Karras 可以在设置里把采样器去掉

同态加密和SEAL库的介绍(十)CKKS 参数心得 2

写在前面&#xff1a; 本篇继续上篇的测试&#xff0c;首先针对密文深度乘法情况&#xff0c;虽然密文乘法本就是应该尽量避免的&#xff08;时间和内存成本过高&#xff09;&#xff0c;更不用说深度乘法了&#xff0c;但是为了测试的完整性&#xff0c;还是做一下方便大家比对…

CVE-2021-21315漏洞复现

一、基本信息 攻击机&#xff1a;kali IP:192.168.100.60 靶机&#xff1a;CentOS7 IP:192.168.100.40 二、攻击过程 下载node.js环境 wget https://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-x64.tar.xz tar -xvf node-v12.18.4-linux-x64.tar.xz mv node-v12.18.4-…

89.WEB渗透测试-信息收集-Google语法(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;88.WEB渗透测试-信息收集-Google语法&#xff08;2&#xff09; 常用的 Google 语法的作用…

【大数据平台】可扩展性设计

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

线程间同步的概念

一、线程间同步的概念 rtthread通过线程间同步建立线程间的执行顺序&#xff0c;多个线程访问的同一个内存叫做临界区。rtthread提供的同步的工具 1、信号量 2、互斥量 3、事件集 二、信号量 2.1 信号量概念 rtthread将信号量抽象成rt_semaphore. 2.2 信号量api 2.3 信号量示例…

本地Docker部署开源Web相册图库Piwigo与在线远程访问实战方案

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【leetcode详解】T3137(思路详解 代码优化感悟)

思路详解 要解决这个问题&#xff0c;我们的大致思路是这样&#xff1a;找到长度为k的字符串 (记为stringA) &#xff0c;统计重复次数最多的那一个&#xff0c;则最终对应的k周期字符串就是 [stringA * n] 的形式( n word.length() / k&#xff09; 要实现多对象的计数&…

【数据结构】关于Java对象比较,以及优先级队列的大小堆创建你了解多少???

前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解对象的比较&#xff0c;以及优先级队列堆&#xff0c;希望你能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/MSex7 &#x1f308;感兴趣的小伙伴看一看小编主页&…

分享一个基于SpringBoot的物品代购系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…