我正在尽力学习javafx,尽管lambda表达式很棒,但有时我需要编写我的代码以在单独的类中处理事件,但重复使用类似的逻辑。我发现的大多数教程都使用lambda表达式创建一个匿名的内部类来处理事件。
类似的东西,如果文本字段中的文本更改
,则会更改标签的文本class1Grade.textProperty().addListener((observable, oldValue, newValue) -> {
gpaOverallLabel.setText( class1Grade.getText() );
});
问题是,我有一堆标签和文本场,想编写1堂课来处理所有相同类型的事件,然后只需在Textfields上注册此类,因为我无法真正重复使用Lambda表达式。
我不知道该部分正在创建
什么方法或类(observable, oldValue, newValue)
我在Javafx事件上找到了此页面非常有帮助,并且能够随时向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表达式变成可以用于多个Textfields
的类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);
}
}
}
,我可以在代码的其他部分中向我的文字场所注册此类
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表达式中并单击它,则显示选项使用匿名的内class ,它会自动将lambda表达式转换为匿名内类。