2017-03-31 146 views
1

我在Java和C#等OOP语言方面经验丰富。直到现在,从来没有与FX搞混,开始在办公室里忙于处理无聊事件。JavaFX事件处理之谜 - 代码已被删除且事件仍处理?

我的FX应用程序全部编写在一个类中。我输入我想要的软件包,包括这两个:

import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 

我实现了事件处理程序接口与我的主类声明,像这样类型的ActionEvent ..

public class Main extends Application implements EventHandler<ActionEvent> 

我在写一个匿名内部类按钮对象来处理click事件,像这样..

btnButton.setOnAction(new EventHandler<ActionEvent>(){ 
     public void handle(ActionEvent event) { 
      System.out.println("I got clicked"); 
     } 
}); 

显然,它的工作就像它应该但后来我跑了一个实验。我从上面删除了两个进口。我删除了Main类声明的“implements”部分。这使我的应用程序没有任何事件处理的参考。然后我又回到了我的按钮对象并写下了事件处理程序,像这样一个lambda表达式...

btnButton.setOnAction(e -> System.out.println("I got touched")); 

你猜怎么着?它仍然工作!这是不可能的..有人可以解释如何删除处理事件所需的代码后仍然工作?这有点有趣,它让我心生疑虑。

在此先感谢您的回复!

-KeplerIO

+0

据我了解,从[这里](https://docs.oracle.com/javase/tutorial/java/javaOO/ lambdaexpressions.html),lambda表达式已经是默认的Java 8库的一部分,并且完全理解如何自动处理多个构造。这包括按钮操作。 – Sedrick

回答

2

你没有删除所需的代码事件处理:

public class Main extends Application implements EventHandler<ActionEvent> 

Main类实现EventHandler<ActionEvent>从来没有要求,因为你使用的是anonymus类作为事件处理反正,代替

btnButton.setOnAction(this); 

(假设第this引用这里ËMain实例)

同样的lambda表达式的好处之一是,你可以,只要Java编译器仍然能够确定你实现接口(以及由此的签名省去参数类型方法)毫不含糊地。

在这种情况下setOnAction方法没有过载和Java编译器可以确保所述参数是EventHandler<ActionEvent>型的,并且该方法的实施的签名是

public void handle(ActionEvent event) 

因此

btnButton.setOnAction((ActionEvent e) -> System.out.println("I got touched")); 

甚至

btnButton.setOnAction(e -> System.out.println("I got touched")); 

“sati sfies“编译器。


这将是不同的,如果setOnAction方法超载Button

public void setOnAction(Consumer<Integer> x) { ... } 

在这种情况下,编译器会需要额外的信息来确定该方法使用:

btnButton.setOnAction((Integer a) -> System.out.println("something")); 
btnButton.setOnAction((ActionEvent a) -> System.out.println("something")); 
btnButton.setOnAction((Consumer<Integer>) a -> System.out.println("something")); 
btnButton.setOnAction((EventHandler<ActionEvent>) a -> System.out.println("something")); 

如果您有兴趣在规范中查找,这里的相关章节:

+0

谢谢你的答案!我可能没有在我的问题中说清楚,但是我确实删除了主类和进口的“实施”声明。但从你的回答中,我可以收集到.setOnAction自动为我们做出所有想法,这就是事件仍然如此处理!我现在明白了很多。谢谢你,朋友! – KeplerIO