0.废话:

这仅仅是一篇总结性文章。

关于《事件驱动》,网上有很多教程,教你很多
概念性的东西,让你学会了怎么为控件添加事件。
然而,这里我并不打算讲概念,我只想讲讲我对事件
驱动学习的理解。

1.事件类:

+++++++++++++++包名——— 类名
Java_________ :java . util .EventObject
JavaFX的一层类:javafx . event .Event


javafx 代表产品 javafx类_开发语言


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中使用事件编程了。