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);
}
}