JavaFX初探与MediaPlayer(2)
2017-12-05 22:21
225 查看
JavaFX的Button、事件和lambda表达式
上次我在gakki女神的盛世美颜推动下首开博客之后,滚去画了两天电路板(虽然并不可能制出来),然后就想不到接下来该写什么了。我的目标是写到MediaPlayer完结,但HelloWorld之后才知路漫漫。既然JavaFX是GUI,GUI是UI,就肯定要和用户交互。那正常程序员人想到的肯定都是按钮Button了。Button是图形化的,但又通常只完成一个功能,简单方便,简直就是GUI界的Hello Horld!所以我们就从Button开始用户交互吧。
我用的IDE是NetBeans(请不要在我的博客、票圈或别的地方打编辑器圣战!),NetBeans生成的JavaFX初始代码就是一个按钮Hello World,论证了Button是GUI界HelloWorld这一论断的正确性。现在我们NetBeans生成的这段代码的start函数:
@Override public void start(Stage primaryStage) { Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); StackPane root = new StackPane(); root.getChildren().add(btn); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); }
代码第3行建立了Button对象,第5行开始为Button Set on Action,这才是设置当用户按下时要执行的代码。
我们看到,SetOnAction方法的参数是一个EventHandler。这里就要提及JavaFX的事件理论了:JavaFX中,有一类对象可以作为事件源对象(event source object),它们发生事件;发生事件之后,就调用一个事件操作对象(event handler object)来处理事件。
(这个操作过程让我这样写惯单片机的人马上就联想到了单片机中断,真是容易理解的设计呢^_^)
要想成为事件源对象,它必须是接口
EventHandler<T extends event>的实例。这里又涉及面向对象的程序设计理论了,因为我对面向对象的理论其实一无所知,所以我们继续。显然,按键是实现了这个接口的,我们用就好了。
这个
EventHandler又是个抽象类,要我们把处理的代码自己写在
handle方法里,于是就
@Override了
handle方法,到控制台又输出了一遍hello world。这个程序就这么简单。
JavaFX里用各种事件(Event)来完成常见的用户交互,除了对Button而言显而易见的ActionEvent,还有一般由Pane处理的键盘事件KeyEvent和鼠标事件MouseEvent,以及等等。操作他们的语法都是像上面这样建立
EventHandler,简单方便。
且慢,简单方便在这里恐怕不合适——为了实现一个按键,我还专门去继承一个抽象类,大花括号括来括去,遇到换行党代码怕是丑得不能看(我就是C语言换行Java不换行的异端)。但在我用NetBeans的时候,它就会提示我“可创建lambda表达式”。我第一次见lambda表达式是在读C++ Primer的时候,然而并没学懂。它怎么提示了,那我就试试看:
btn.setOnAction((ActionEvent event) -> { System.out.println("Hello World!"); });
貌似省了两行。。。其实lambda表达式帮我们省略了定义
EventHandler、说明覆盖
handle的代码。关于lambda表达式,这篇博客说得很清楚,我这种Primer都读不懂的就不班门弄斧了:
http://blog.csdn.net/renfufei/article/details/24600507
我们可以看到lambda表达式确实帮我们省略了一定的代码,而且,写得多了之后,我们会觉得lambda表达式在写JavaFX中非常有用——一般像EventHandler这样的功能,很少会多个对象用同一个handle的,这样专门声明handle就显得多此一举了。后面要完成我们的MediaPlayer,还会用到Listener,Listener和EventHandler很像,而且也可以用lambda表达式简化。这就是以后的故事了。
相关文章推荐
- JavaFX初探与MediaPlayer(5)
- JavaFX初探与MediaPlayer(1)
- JavaFX初探与MediaPlayer(3)
- MediaPlayer控件的初探
- javaFX初探(使用画布 API)
- javafX初探(滚动条)
- JavaFX初探(盘状图表)
- JavaFX 2 初探----Eclipse下运行Ensemble程序
- javaFX初探(Shape3D)
- javafX初探(多选框)
- javaFX初探(Camera)
- JavaFX初探(1)
- JavaFx初探
- javaFX初探(灯光)
- javaFX初探(Label)
- javafX初探(按钮)
- javafX初探(选择框)
- javaFX初探(材料)
- javafX初探(文本域)
- javaFX初探(选择)