您的位置:首页 > 编程语言 > Java开发

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