如何对JavaFX lambda表达式进行反向工程并获取EventHandler和ActionListener的类定义
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对JavaFX lambda表达式进行反向工程并获取EventHandler和ActionListener的类定义相关的知识,希望对你有一定的参考价值。
我正在尽力学习JavaFX,虽然lambda表达式很棒,但我有时需要编写代码来处理单独类中的事件,重用类似的逻辑。我发现的大多数教程都使用lambda表达式来创建一个处理事件的匿名内部类。
像这样的东西,如果TextField中的文本发生变化,它会改变标签的文本
class1Grade.textProperty().addListener((observable, oldValue, newValue) -> {
gpaOverallLabel.setText( class1Grade.getText() );
});
问题是我有一堆标签和TextFields,并且想要编写1个类来处理所有相同类型的事件,然后只使用TextFields注册这个类,因为我无法真正重用lambda表达式。
我不知道这个部分正在创建什么方法或类
(observable, oldValue, newValue)
我发现this page on JavaFX events非常有用,并且能够随时向TextField添加事件以聚焦更改(即用户按Tab键)。
我开始使用这段代码
// Listen for TextField text changes
textField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable,
String oldValue, String newValue) {
outputTextArea.appendText("TextField Text Changed (newValue: " + newValue + ")
");
}
});
并且能够成功地将lambda表达式转换为可用于多个TextField的类
class TextFieldListener implements ChangeListener<Boolean> {
private final TextField numericTextField;
private final Label errorLabel;
TextFieldListener(TextField numericTextField, Label errorLabel) {
this.numericTextField = numericTextField;
this.errorLabel = errorLabel;
}
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if(!newValue){ // check if focus gained or lost
//check if INVALID
String errorText = " err";
// String errorText = model.getNumericErrorTextIfInvalid();
errorLabel.setText(numericTextField.getText()+errorText);
}
}
}
我可以在代码的其他部分用TextFields注册这个类
class1Grade.focusedProperty().addListener(new TextFieldListener(class1Grade, class1GradeError));
class1Credits.focusedProperty().addListener(new TextFieldListener(class1Credits, class1CreditsError));
我的重要问题是如何获取lambda表达式示例并找出与其调用的事件处理相关的实际底层方法或类?
不幸的是,在lambda表达式用作方法参数的情况下,您需要考虑将函数接口作为参数的方法的所有重载版本。在这种情况下,StringProperty.addListener
有以下可能性:
ChangeListener<? super String>
InvalidationListener
现在检查这些接口的抽象方法是否具有合适的签名。
在这种情况下,InvalidationListener.invalidated
只采用一个参数来消除它作为可能性。 ChangeListener.changed
有3个参数,这意味着签名是合适的......
但是,某些IDE应该提供自动执行此功能的功能。例如。 NetBeans 8在代码行旁边显示一个灯泡,如果将光标放在lambda表达式中并单击它,则显示选项Use anonymous inner class,它自动将lambda表达式转换为匿名内部类。
以上是关于如何对JavaFX lambda表达式进行反向工程并获取EventHandler和ActionListener的类定义的主要内容,如果未能解决你的问题,请参考以下文章