1.概念
JavaFX最重要的特性就是屬性綁定侮繁,事件也推薦這樣做休溶,和swing咖祭、Android常用的set***的方式加事件監(jiān)聽有區(qū)別渡冻。
事件簡單來說就是給界面上的Node添加一些行為辣辫,使之具備相應(yīng)的功能旦事。
2.分類
- 前臺事件:和用戶UI直接相關(guān)的,鼠標急灭、鍵盤姐浮、列表、文本框等
- 后臺事件:系統(tǒng)中斷葬馋、硬件軟件的錯誤单料、超時、失效等
3.常見事件
- 鼠標事件:點擊文本点楼、圖片鼠標進入效果等
- 鍵盤事件:功能鍵扫尖、快捷鍵、游戲
- 窗口事件:窗口大小改變掠廓、窗口打開换怖、關(guān)閉等觸發(fā)
- 焦點事件:文本框、密碼框等獲得焦點蟀瞧、失去焦點
- 列表選項事件:單選沉颂、復(fù)選、下拉悦污、ListView铸屉、TableView、TreeView等選項發(fā)生改變切端,獲得最新選取的值
- 拖拽事件:拖動窗口彻坛、拖動目標組件
4.要素
以鼠標點擊某個文本組件nameLabel為例:
- target:目標—文本組件nameLabel
- source:事件源—Mouse
- type:事件類型—鼠標單擊,MouseClicked
5.示例
以鍵盤事件為例踏枣,本例實現(xiàn)用上下左右方向鍵來控制一個屏幕上隨機位置出現(xiàn)的按鈕移動昌屉,移動到目的地就彈框提示。也可以直接按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) {
//給按鈕一個隨機起始位置,用隨機數(shù)生成其橫縱坐標
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竞帽,實現(xiàn)向右移動的效果
if (keyCode == KeyCode.RIGHT) {
x = x + 1;
AnchorPane.setLeftAnchor(btn, x);
}
//向左鍵扛施,每按一次橫坐標減1,實現(xiàn)向左移動的效果
if (keyCode == KeyCode.LEFT) {
x = x - 1;
AnchorPane.setLeftAnchor(btn, x);
}
//向下鍵屹篓,每按一次縱坐標加1煮嫌,實現(xiàn)向下移動的效果
if (keyCode == KeyCode.DOWN) {
y = y + 1;
AnchorPane.setTopAnchor(btn, y);
}
//向上鍵,每按一次縱坐標減1抱虐,實現(xiàn)向上移動的效果
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);
}
}
}