首页 > 编程语言 >JavaFX 常见事件类型及事件处理

JavaFX 常见事件类型及事件处理

时间:2024-06-04 14:22:53浏览次数:30  
标签:事件处理 javafx 常见 JavaFX scene 事件 new import public

什么是事件驱动编程

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

事件驱动编程广泛应用于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,常见,JavaFX,scene,事件,new,import,public
From: https://www.cnblogs.com/binbingg/p/18230666

相关文章

  • java -jar命令常见使用方法
    1、基本用法:java-jarfilename.jar这是最简单的用法,直接指定要运行的JAR文件的名称(包括.jar扩展名)。Java虚拟机(JVM)将加载并执行JAR文件中的主类(在JAR文件的META-INF/MANIFEST.MF文件中指定为主类)。2.使用nohup在后台运行:如果你希望在后台运行JAR文件,......
  • JavaFX 常见UI控件使用
    UI控件介绍JavaFX提供了一套丰富的用户界面控件,这些控件可以用来创建现代的、交互式的图形用户界面(GUI)。JavaFX控件是JavaFX库中预定义的组件,它们封装了创建用户界面元素的复杂性,使得开发者可以快速地构建应用程序界面。以下是一些常见的JavaFX控件:控件名说明L......
  • JavaFX 常见布局组件的使用
    Laytout简介JavaFX提供了多种布局管理器(LayoutManagers),它们用于自动管理用户界面组件的位置和大小。布局管理器可以简化UI设计,因为它们会根据窗口的大小变化自动调整其中的组件。布局组件JavaFX包含以下布局组件:布局名称中文说明AnchorPane锚点布局允许开发......
  • 英语常见字符读法
    通讯行业称呼“#”叫做:poundkey(\#是英镑的代号,电子业sharp,正式名称为"numbersign"),称呼“*”叫做:starkey,数字键叫做:numberkey点:dot/:slash.\:backslashPunctuationmarksapostrophe(')(’)brackets(())([])({})(〈〉)colon(:)......
  • Java中常见错误-Java中注解是否可以继承
    Java中注解是否可以继承@Inherited基本概念使用场景注意事项实体类自定义注解测试方法运行结果使用@Inherited不使用@Inherited结论在解决这个问题之前需要先了解一下@Inherited@Inherited基本概念​@Inherited是Java中的一个元注解,位于java.lang.annotatio......
  • docker的网络功能的常见命令
    命令说明文档地址dockernetworkcreate创建一个网络dockernetworkcreatedockernetworkls查看所有网络docs.docker.comdockernetworkrm删除指定网络docs.docker.comdockernetworkprune清除未使用的网络docs.docker......
  • 高德坐标打点(点为正常的WGS84地球坐标系,常见于 GPS 设备,Google 地图等国际标准的坐标
    创建一个js文件工具//WGS84toGCJ-02converter//高德转地球坐标//coordinateUtils.jsconstPI=3.1415926535897932384626;consta=6378245.0;//a:WGS84大地坐标系的长半轴constee=0.00669342162296594323;//ee:WGS84椭球的偏心率平方//WGS84toGC......
  • 深度学习--向量,矩阵常见的乘法运算--82
    目录1.向量的数乘2.向量的内积--也叫做点乘3.向量的外积--也叫向量积、叉乘、叉积4.矩阵的数乘5.矩阵的乘法(matmulproduct)6.矩阵的哈达玛积(hadamardproduct):两个相乘的矩阵维度一致,逐元素相乘(也叫矩阵点乘,element-wiseproduct,entrywiseproduct)7卷积1.向量的数......
  • 南昌公司办理食品资质代办的几个常见问题和知识看了不踩坑
    办理食品资质(如食品经营许可证、食品生产许可证)是食品相关企业合法经营的前提。以下是南昌公司办理食品资质代办时常见的问题和注意事项,希望能避免常见陷阱:1.了解资质类型食品经营许可证:适用于开展食品销售和餐饮服务的企业。食品生产许可证:适用于从事食品生产加工的企业。......
  • 程序分享--常见算法/编程面试题:删除有序数组中的重复项 II
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。或关注博主免费专栏【程序......