1.概念
JavaFX最重要的特性就是属性绑定,事件也推荐这样做,和swing、Android常用的set***的方式加事件监听有区别。
事件简单来说就是给界面上的Node添加一些行为,使之具备相应的功能。
2.分类
- 前台事件:和用户UI直接相关的,鼠标、键盘、列表、文本框等
- 后台事件:系统中断、硬件软件的错误、超时、失效等
3.常见事件
- 鼠标事件:点击文本、图片鼠标进入效果等
- 键盘事件:功能键、快捷键、游戏
- 窗口事件:窗口大小改变、窗口打开、关闭等触发
- 焦点事件:文本框、密码框等获得焦点、失去焦点
- 列表选项事件:单选、复选、下拉、ListView、TableView、TreeView等选项发生改变,获得最新选取的值
- 拖拽事件:拖动窗口、拖动目标组件
4.要素
以鼠标点击某个文本组件nameLabel为例:
- target:目标—文本组件nameLabel
- source:事件源—Mouse
- type:事件类型—鼠标单击,MouseClicked
5.示例
以键盘事件为例,本例实现用上下左右方向键来控制一个屏幕上随机位置出现的按钮移动,移动到目的地就弹框提示。也可以直接按ctrl+enter组合键,来直接使按钮到达目的地。
启动程序
package com.niit.fxstudy.event;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class KeyEventApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/keyevent.fxml"));
Parent root = fxmlLoader.load();
Scene scene = new Scene(root);
primaryStage.setTitle("键盘事件例子");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
布局文件
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Button?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.niit.fxstudy.event.KeyEventController"
prefWidth="400" prefHeight="300">
<Button text="移动的按钮" fx:id="btn" onKeyPressed="#moveBtn"/>
</AnchorPane>
控制器文件
package com.niit.fxstudy.event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.AnchorPane;
import java.net.URL;
import java.util.Random;
import java.util.ResourceBundle;
public class KeyEventController implements Initializable {
@FXML
private Button btn;
@Override
public void initialize(URL location, ResourceBundle resources) {
//给按钮一个随机起始位置,用随机数生成其横纵坐标
Random random = new Random();
int startX = random.nextInt(400);
int startY = random.nextInt(300);
AnchorPane.setLeftAnchor(btn, (double) startX);
AnchorPane.setTopAnchor(btn, (double) startY);
}
public void moveBtn(KeyEvent event) {
//获取按钮当前位置
double x = btn.getLayoutX();
double y = btn.getLayoutY();
System.out.println("当前坐标:" + x + "," + y);
//获取键码
KeyCode keyCode = event.getCode();
//向右键,每按一次横坐标加1,实现向右移动的效果
if (keyCode == KeyCode.RIGHT) {
x = x + 1;
AnchorPane.setLeftAnchor(btn, x);
}
//向左键,每按一次横坐标减1,实现向左移动的效果
if (keyCode == KeyCode.LEFT) {
x = x - 1;
AnchorPane.setLeftAnchor(btn, x);
}
//向下键,每按一次纵坐标加1,实现向下移动的效果
if (keyCode == KeyCode.DOWN) {
y = y + 1;
AnchorPane.setTopAnchor(btn, y);
}
//向上键,每按一次纵坐标减1,实现向上移动的效果
if (keyCode == KeyCode.UP) {
y = y - 1;
AnchorPane.setTopAnchor(btn, y);
}
//判断按钮是否移动到指定点
System.out.println("目的地坐标:150,100");
if (x == 150.0 && y == 100.0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("提示");
alert.setContentText("success");
alert.showAndWait();
}
//按下ctrl+enter组合键,直接让按钮到达目标位置
final KeyCombination keyCodeCombination = new KeyCodeCombination(KeyCode.ENTER, KeyCombination.CONTROL_DOWN);
if (keyCodeCombination.match(event)) {
AnchorPane.setLeftAnchor(btn, 150.0);
AnchorPane.setTopAnchor(btn, 100.0);
}
}
}