JavaFX初探与MediaPlayer(2)

来源:互联网 发布:呱呱漫画下载软件 编辑:程序博客网 时间:2024/06/10 16:23

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方法里,于是就@Overridehandle方法,到控制台又输出了一遍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表达式简化。这就是以后的故事了。

原创粉丝点击