什么是事件驱动编程

事件驱动编程是一种编程范式,其中程序的执行流程是由外部事件(如用户输入、传感器读数、消息接收等)触发的。在这种模式下,程序不是按照预定的顺序执行,而是响应事件来执行代码。这种编程方式在需要处理异步操作或与用户交互的应用程序中非常常见。

事件驱动编程广泛应用于Web开发(如JavaScript)、图形用户界面(GUI)编程、网络编程、游戏开发等领域。通过使用事件驱动编程,开发者可以创建更加灵活、可扩展和响应式的应用程序。

JavaFX 常见事件类型

JavaFX 提供了一套丰富的事件系统,允许开发者响应各种用户交互和系统生成的事件。

以下是一些常见的 JavaFX 事件类型:

事件名称 英文 描述
鼠标事件 MouseEvents MouseEvent.CLICKED:鼠标左键单击
MouseEvent.PRESSED:鼠标按钮被按下
MouseEvent.RELEASED:鼠标按钮被释放
MouseEvent.DRAG_DETECTED:鼠标拖动被检测到
MouseEvent.MOUSE_ENTERED:鼠标进入组件区域
MouseEvent.MOUSE_EXITED:鼠标离开组件区域
键盘事件 KeyEvents KeyEvent.PRESS:键盘按键被按下
KeyEvent.RELEASE:键盘按键被释放
KeyEvent.TYPED:键盘按键被输入(通常与字符输入相关)
动作事件 ActionEvents 通常与按钮点击相关,当按钮被点击并释放时触发
窗口事件 WindowEvents WindowEvent.CLOSE_REQUEST:窗口关闭请求
WindowEvent.WINDOW_CLOSE:窗口关闭完成
WindowEvent.WINDOW_HIDDEN:窗口被隐藏
WindowEvent.WINDOW_SHOWING:窗口即将显示
上下文菜单事件 ContextMenuEvent 当用户点击鼠标右键或通过键盘快捷键打开上下文菜单时触发
滚动事件 ScrollEvent 当用户使用鼠标滚轮或触摸板上的滚动手势时触发
旋转事件 RotationEvent 当用户通过触摸板或触摸屏进行旋转手势时触发
缩放事件 ZoomEvent 当用户通过触摸板、触摸屏或鼠标滚轮进行缩放操作时触发
触摸事件 TouchEvent 当触摸屏上发生触摸事件时触发,包括触摸开始、移动、结束等
输入方法事件 InputMethodEvent 当使用输入方法编辑器(IME)输入文本时触发
焦点事件 FocusEvent FocusEvent.FOCUS_GAINED:获得焦点
FocusEvent.FOCUS_LOST:失去焦点
选择事件 SelectionEvent 当用户选择或取消选择列表项、表格单元等时触发
值变更事件 ValueChangeEvent 当绑定的属性值发生变化时触发
属性变更事件 PropertyChangeEvent 当 JavaFX 属性发生变化时触发

这些事件类型覆盖了用户与应用程序交互的各个方面,从简单的鼠标点击到复杂的触摸手势,以及窗口和组件的生命周期事件。开发者可以根据需要为这些事件类型编写事件处理器,以实现应用程序的交互逻辑。

ActionEvents(动作事件)

在JavaFX中,ActionEvent 是一个表示用户触发动作的事件,比如点击按钮、选择菜单项或按下键盘上的特定键。

案例演示

按钮点击事件处理

package com.binge.javafxdemo.event;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage; import java.util.Optional; public class ActionEventExample extends Application { @Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("点击按钮"); // 设置动作事件处理器
btn.setOnAction(event -> {
System.out.println("按钮被点击");
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("点击按钮事件");
alert.setHeaderText(null);
alert.setContentText("按钮被点击了!");
alert.show();
}); StackPane root = new StackPane();
root.getChildren().add(btn); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("按钮点击事件示例");
primaryStage.setScene(scene);
primaryStage.show();
} public static void main(String[] args) {
launch(args);
}
}

FocusEvent(焦点事件)

在JavaFX中,FocusEvent 是一个表示组件焦点变化的事件。焦点事件用于通知应用程序用户界面(UI)中的组件何时获得或失去焦点。JavaFX提供了几种焦点事件类型,它们都继承自 FocusEvent 类。

FocusEvent 的事件类型:

  • FOCUS_GAINED: 当一个组件获得焦点时触发。
  • FOCUS_LOST: 当一个组件失去焦点时触发。
  • FOCUSED: 当一个组件获得焦点时触发,无论焦点是进入还是离开。
  • UNFOCUSED: 当一个组件失去焦点时触发,无论焦点是进入还是离开。

案例演示

获取和失去焦点事件

package com.binge.javafxdemo.event;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage; public class FocusEventExample extends Application { @Override
public void start(Stage primaryStage) {
TextField textField = new TextField();
textField.setMaxWidth(100);
TextField textField2 = new TextField();
textField2.setMaxWidth(100);
textField.setPromptText("输入姓名");
textField2.setPromptText("输入邮箱"); // 设置焦点事件处理器
textField.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
if (isNowFocused) {
System.out.println("获取焦点");
} else {
System.out.println("失去焦点");
}
}); VBox root = new VBox();
root.getChildren().add(textField);
root.getChildren().add(textField2); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("焦点事件示例");
primaryStage.setScene(scene);
primaryStage.show();
} public static void main(String[] args) {
launch(args);
}
}

SelectionEvent(选择事件)

在JavaFX中,SelectionEvent 是一个抽象类,它表示一个选择操作的事件,一般用于列表或表格以响应用户的选择操作。

案例演示1

ListView 选择事件

package com.binge.javafxdemo.event;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage; public class ListViewSelectionEventExample extends Application { @Override
public void start(Stage primaryStage) {
ObservableList<String> items = FXCollections.observableArrayList(
"Item 1", "Item 2", "Item 3", "Item 4"
); ListView<String> listView = new ListView<>(items);
listView.setPrefSize(200, 200); // 设置选择事件处理器
listView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
System.out.println("Selected item: " + newSelection);
}
}); StackPane root = new StackPane();
root.getChildren().add(listView); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Selection Event Example");
primaryStage.setScene(scene);
primaryStage.show();
} public static void main(String[] args) {
launch(args);
}
}

案例演示2

TableView 选择事件

package com.binge.javafxdemo.event;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage; public class TableViewSelectionExample extends Application {
public static class Fruit {
private int id;
private String name;
private String color; public Fruit(int id, String name, String color) {
this.id = id;
this.name = name;
this.color = color;
} public int getId() {
return id;
} public String getName() {
return name;
} public String getColor() {
return color;
} @Override
public String toString() {
return "Fruit{" +
"id=" + id +
", name='" + name + '\'' +
", color='" + color + '\'' +
'}';
}
} @Override
public void start(Stage primaryStage) {
ObservableList<Fruit> items = FXCollections.observableArrayList(
new Fruit(1,"苹果", "红色"),
new Fruit(2,"香蕉", "黄色"),
new Fruit(3,"草莓", "红色"),
new Fruit(4,"樱桃", "棕色")
); TableView<Fruit> tableView = new TableView<>();
TableColumn<Fruit, Integer> idColumn = new TableColumn<>("编号");
idColumn.setCellValueFactory(new PropertyValueFactory<>("id"));
TableColumn<Fruit, String> nameColumn = new TableColumn<>("名称");
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<Fruit, String> colorColumn = new TableColumn<>("颜色");
colorColumn.setCellValueFactory(new PropertyValueFactory<>("color")); tableView.getColumns().addAll(idColumn, nameColumn, colorColumn);
tableView.setItems(items); // 设置选择事件处理器
tableView.getSelectionModel().selectedItemProperty().addListener((obs, oldItem, newItem) -> {
if (newItem != null) {
System.out.println("Selected fruit: " + newItem);
}
}); StackPane root = new StackPane();
root.getChildren().add(tableView); Scene scene = new Scene(root, 400, 300); primaryStage.setTitle("TableView Selection Event Example");
primaryStage.setScene(scene);
primaryStage.show();
} public static void main(String[] args) {
launch(args);
}
}

JavaFX 常见事件类型及事件处理的更多相关文章

  1. DOM笔记(五):JavaScript的常见事件和Ajax小结

    一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 on ...

  2. JavaScript的常见事件和Ajax小结

    一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 on ...

  3. javascript常见的几种事件类型

    第一种事件类型:onchange() <body> <select id="sheng" onchange="fn1();"> < ...

  4. javascript 的 事件类型(事件)

    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. 事件是文档或者浏览器窗口中发生的,特定的交互瞬间. 事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都 ...

  5. Javascript中的事件对象和事件类型

    接上次看JS的事件冒泡和捕获,所以顺带就把事件相关的知识都看完好了 而且想到一个好的学习方法,第一天自己看,第二天把前一天学习的东西写下来,一方面可以当复习,一方面当重新整理并且分享 事件对象 事件处 ...

  6. javascript事件类型之界面拖拽交互

    一.在线DEMO 界面拖拽交互

  7. 在 SharePoint Server 2013 中配置建议和使用率事件类型

    http://technet.microsoft.com/zh-cn/library/jj715889.aspx 适用于: SharePoint Server 2013 利用使用事件,您可以跟踪用户与 ...

  8. 《JAVASCRIPT高级程序设计》事件处理程序和事件类型

    一.事件流 谈到事件,首要要理解事件流的概念:事件流是指从页面接受事件的顺序:“DOM2级事件”规定事件流包括三个阶段:事件捕获阶段.处于目标阶段和事件冒泡阶段.目前大部分的浏览器的事件流是事件冒泡, ...

  9. javaScript事件(六)事件类型之滚轮事件

    滚轮事件其实就是一个mousewheel事件,这个事件跟踪鼠标滚轮,类似Mac的触屏版. 一.客户区坐标位置 鼠标事件都是在浏览器视口的特定位置上发生的.这个位置信息保存在事件对象的clientX和c ...

  10. JS弹出下载对话框以及实现常见文件类型的下载

    写在前面 JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能. ...

随机推荐

  1. 上班第一天安装idea

    分享一波 IDEA 2023.2.5 版本的激活码,需搭配破解补丁一起使用,永久有效,亲测好用(前面步骤差不多,主要看后面)~ 申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络, ...

  2. WPF实现简易计算器(MVVM、控件自定义样式)

    目录 WPF实现简易计算器(MVVM.控件自定义样式) 界面 文件结构 项目代码 WPF实现简易计算器(MVVM.控件自定义样式) 运行环境:VS2022 .Net framework4.8 完整项目 ...

  3. 数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配

    一.JM启动过程 1.从日志角度分析启动流程 1)client生成jobGraph 详情请参考:https://www.bilibili.com/video/BV13K4y1P7ri 2)Yarn R ...

  4. Kerberos身份验证在ChunJun中的落地实践

    Kerberos,在古希腊神话故事中,指的是一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中. 那么在现实中,Kerberos指的是什么呢? 一.Kerberos介绍 01 Kerberos是什么 ...

  5. C#/.NET/.NET Core技术前沿周刊 | 第 44 期(2025年6.23-6.30)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  6. mermaid与marked结合使用

    前提 两者都很强大,但是两者结合,存在问题,目前网上无解. 以下两种版都需要在index.html 即入口页面添加一个元素 <body> <div id="root&quo ...

  7. Mysql不支持emoji表情

    报错 今天存储emoji,报错如下: 这是因为表情是4个字节的,Mysql的utf-8编码只支持3个字节的数据,所以要使用到新的编码utf8mb4 解决 注意:数据库的版本要 5.5.3+ 才可以支持 ...

  8. AtCoder Beginner Contest 187 ABCDE 题解

    A - Large Digits 思路:签到题,读入字符串即可. view code #include<iostream> #include<string> #include& ...

  9. less 剖析

    简介 不熟悉less,经常该样式要花费很多时间所以进行系统性的学习 参考链接 https://www.bilibili.com/video/BV1YW411T7vd?p=8 http://lesscs ...

  10. Restcloud新手小白使用感受

    Restcloud新手小白使用感受 版本:Restcloud ETL 社区版V1.1.0 搞了几年的运维工作,中间陆陆续续因为公司各系统不够完善,但是用户的各种报表需求又不能拒绝,最后的产生结果就是在 ...