如何对 JavaFX lambda 表达式进行逆向工程并获取 EventHandler 和 ActionListener 的 class 定义
How to reverse engineer JavaFX lambda expression and get class definition for EventHandler and ActionListener
我正在尽最大努力学习 JavaFX,尽管 lambda 表达式很棒,但有时我需要编写我的代码来单独处理事件 classes 以重用类似的逻辑。我发现的大多数教程都使用 lambda 表达式来创建处理事件的匿名内部 class。
如果 TextField 中的文本发生变化,类似这样的内容会更改标签的文本
class1Grade.textProperty().addListener((observable, oldValue, newValue) -> {
gpaOverallLabel.setText( class1Grade.getText() );
});
问题是我有一堆标签和 TextFields 对,想写 1 class 来处理所有相同类型的事件,然后只需将此 class 注册到 TextFields 因为我真的不能重用 lambda 表达式。
我不知道这部分是用什么方法或class创建的
(observable, oldValue, newValue)
我发现 this page on JavaFX events 非常有帮助,并且能够随时向 TextField 添加事件以关注更改(即用户按下选项卡)。
我是从这段代码开始的
// 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 + ")\n");
}
});
并且能够成功地将 lambda 表达式变成可用于多个 TextField 的 class
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 注册这个 class
class1Grade.focusedProperty().addListener(new TextFieldListener(class1Grade, class1GradeError));
class1Credits.focusedProperty().addListener(new TextFieldListener(class1Credits, class1CreditsError));
我的大问题是如何使用 lambda 表达式示例并找出实际的底层方法或 class 与它调用的事件处理相关?
不幸的是,在将 lambda 表达式用作方法参数的情况下,您需要考虑采用功能接口作为参数的方法的所有重载版本。在这种情况下 StringProperty.addListener
有以下可能性:
ChangeListener<? super String>
InvalidationListener
现在检查这些接口的抽象方法是否有合适的签名。
在这种情况下,InvalidationListener.invalidated
只接受一个参数,将其排除在外。 ChangeListener.changed
有 3 个参数,这意味着签名是合适的...
但是一些 IDE 应该提供自动为您完成这项工作的功能。例如。 NetBeans 8 会在代码行旁边显示一个灯泡,如果您将光标放在 lambda 表达式内并单击它会显示选项 Use anonymous inner class 会自动将 lambda 表达式转换为匿名内部 class.
我正在尽最大努力学习 JavaFX,尽管 lambda 表达式很棒,但有时我需要编写我的代码来单独处理事件 classes 以重用类似的逻辑。我发现的大多数教程都使用 lambda 表达式来创建处理事件的匿名内部 class。
如果 TextField 中的文本发生变化,类似这样的内容会更改标签的文本
class1Grade.textProperty().addListener((observable, oldValue, newValue) -> {
gpaOverallLabel.setText( class1Grade.getText() );
});
问题是我有一堆标签和 TextFields 对,想写 1 class 来处理所有相同类型的事件,然后只需将此 class 注册到 TextFields 因为我真的不能重用 lambda 表达式。
我不知道这部分是用什么方法或class创建的
(observable, oldValue, newValue)
我发现 this page on JavaFX events 非常有帮助,并且能够随时向 TextField 添加事件以关注更改(即用户按下选项卡)。
我是从这段代码开始的
// 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 + ")\n");
}
});
并且能够成功地将 lambda 表达式变成可用于多个 TextField 的 class
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 注册这个 class
class1Grade.focusedProperty().addListener(new TextFieldListener(class1Grade, class1GradeError));
class1Credits.focusedProperty().addListener(new TextFieldListener(class1Credits, class1CreditsError));
我的大问题是如何使用 lambda 表达式示例并找出实际的底层方法或 class 与它调用的事件处理相关?
不幸的是,在将 lambda 表达式用作方法参数的情况下,您需要考虑采用功能接口作为参数的方法的所有重载版本。在这种情况下 StringProperty.addListener
有以下可能性:
ChangeListener<? super String>
InvalidationListener
现在检查这些接口的抽象方法是否有合适的签名。
在这种情况下,InvalidationListener.invalidated
只接受一个参数,将其排除在外。 ChangeListener.changed
有 3 个参数,这意味着签名是合适的...
但是一些 IDE 应该提供自动为您完成这项工作的功能。例如。 NetBeans 8 会在代码行旁边显示一个灯泡,如果您将光标放在 lambda 表达式内并单击它会显示选项 Use anonymous inner class 会自动将 lambda 表达式转换为匿名内部 class.