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

什么是事件驱动编程

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

事件驱动编程广泛应用于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);
    }
}
posted @ 2024-06-04 14:18  Binge-和时间做朋友  阅读(200)  评论(0编辑  收藏  举报