0.废话:
这仅仅是一篇总结性文章。
关于《事件驱动》,网上有很多教程,教你很多
概念性的东西,让你学会了怎么为控件添加事件。
然而,这里我并不打算讲概念,我只想讲讲我对事件
驱动学习的理解。
1.事件类:
+++++++++++++++包名——— 类名
Java_________ :java . util .EventObject
JavaFX的一层类:javafx . event .Event
0.最顶部的类:EventObject
1.一层继承类:Event
2.二层继承类:ActionEvent,//非常常用
InputEvent,//常用它的子类
WindowEvent
3.InputEvent子类:MouseEvent,KeyEvent
2.事件处理器(EventHandler)
Handler这个单词就是处理器的意思,意思就是事件的处理它全包了。
(一) ActionEvent类事件:
ActionEvent事件注册:.setOnAction(处理器对象);
0.最原始的写法:
(1)、本类实现接口:
/*1*/class MyEventHandler implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent e){
//事件的逻辑......
}
}
/*2*/MyEventHandler myEventHandler=new MyEventHandler();
/*3*/Button myButton=new Button("我的按钮");
/*4*/myButton.setOnAction(myEventHandler);
(2)、外部类实现接口(实例):
public class Controller extends Application /*implements EventHandler<ActionEvent> */{
private Button mButton=new Button("点我切换文本");
public static Label mLabel=new Label("你好");//静态成员方便外部类直接访问
public static boolean flag=true;
@Override
public void start(Stage primaryStage) throws Exception {
mButton.setOnAction(new MyEventHandler());
HBox mPane=new HBox(mButton,mLabel);
Scene mScene=new Scene(mPane,300,100);
primaryStage.setTitle("切换文本");
primaryStage.setScene(mScene);
primaryStage.show();
}
/*************************************************************/
public static void main(String[] args) {
launch(args);
}
}
//外部类实现接口
class MyEventHandler implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent event) {
if (Controller.flag){
Controller.mLabel.setText("你好");
Controller.flag=false;
}
else{
Controller.mLabel.setText("再见");
Controller.flag=true;
}
}
}
1.一级化简: 简单内部类
/*1*/class MyEventHandler implements EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent e){
//事件的逻辑......
}
}
/*2*/Button myButton=new Button("我的按钮");
/*3*/myButton.setOnAction(new MyEventHandler);
二级化简: 匿名内部类
简记:直接 new 一个(事件处理器)接口
/*1*/Button myButton=new Button("我的按钮");
/*2*/myButton.setOnAction(new EventHandler<ActionEvent>{
@Override
public void handle(ActionEvent e){
//事件的逻辑......
}
});
三级化简:推荐!!! lambda表达式
简记:只需要参数关于为什么只需要参数,你可以这样想:类只用一次就扔了,接口的类型ActionEvent也是和注册函数setOnAction的Action对应,函数名也没什么用(因为不需要在其他地方调用)。所以,真正有用的就是函数的参数
/*1*/Button myButton=new Button("我的按钮");
/*2*/myButton.setOnAction(e->{
//事件的逻辑......
}
});
(二) InputEvent类事件:
我们用的是它的子类:MouseEvent —— KeyEvent==>注意:所以的场景Scene和节点Note都可以注册鼠标键盘事件!<==
1.鼠标事件MouseEvent:
注册函数:
setOnMouse +
______________Pressed(e->{…}) :按下
______________Released(e->{…}) :松开
______________Clicked(e->{…}) :按下并松开(点击)
______________Entered(e->{…}) :进入
______________Exited(e->{…}) :离开
______________Moved(e->{…}) :移动
______________Dragged(e->{…}) :拖动
类内函数:
get +
______Button() :返回MouseButton(被单击的鼠标按键)
______ClickCount() :返回int(单击次数)
______X() :返回double(当前控件中的X)
______Y()
______SceneX() :返回double。场景的X
___________Y() :
______ScreenX() :返回double。屏幕X
___________ Y() :
is +
______AltDown() :是否按下Alt键
______ControlDown() : Ctrl键
______ShiftDown() :Shift键
2.键盘KeyEvent:
注册函数:
setOnKey +
____________Pressed(e->{…}) :按下
____________Released(e->{…}) :松开
____________Typed(e->{…}) :敲击
类内函数:
get +
______Character() :返回String(按键字符,试试就懂)
______Code() :返回KeyCode(按键编码)
______Text() :返回String(按键编码说明)
KeyCode | 说明字符串 |
F1~F12 | 从F1到F12的函数键 |
A~Z | 同上 |
CONTROL | Ctrl键 |
…全大写… | …此次省略(你都懂的)… |
is +
______AltDown() :是否按下Alt键
______ControlDown() : Ctrl键
______ShiftDown() :Shift键
示例:
Scene myScene =new Scene();
myScene.setOnMousePressed(e->{
//事件逻辑
});
Text myText =new Text();
myText.setOnMousePressed(e->{
//事件逻辑
});
结尾
结合你的语言基础(分支循环字符串操作等),就可以灵活在JavaFX中使用事件编程了。