如何对JavaFX lambda表达式进行反向工程,并获取EventHandler和ActionListener的类定义

如何对JavaFX lambda表达式进行反向工程,并获取EventHandler和ActionListener的类定义,javafx,lambda,event-handling,actionlistener,eventhandler,Javafx,Lambda,Event Handling,Actionlistener,Eventhandler,我正在尽最大努力学习JavaFX,尽管lambda表达式很棒,但有时我需要编写代码来处理单独类中的事件,并重用类似的逻辑。我发现的大多数教程都使用lambda表达式来创建处理事件的匿名内部类 如果文本字段中的文本发生更改,则会更改标签的文本 class1Grade.textProperty().addListener((observable, oldValue, newValue) -> { gpaOverallLabel.setText( class1Grade.getText(

我正在尽最大努力学习JavaFX,尽管lambda表达式很棒,但有时我需要编写代码来处理单独类中的事件,并重用类似的逻辑。我发现的大多数教程都使用lambda表达式来创建处理事件的匿名内部类

如果文本字段中的文本发生更改,则会更改标签的文本

class1Grade.textProperty().addListener((observable, oldValue, newValue) -> {
    gpaOverallLabel.setText( class1Grade.getText() );
});
问题是我有一堆成对的标签和文本字段,我想写一个类来处理所有相同类型的事件,然后用文本字段注册这个类,因为我不能真正重用lambda表达式

我不知道这部分正在创建什么方法或类

(observable, oldValue, newValue)
我发现这非常有帮助,并且能够在任何时候将事件添加到文本字段以关注更改(即用户按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 + ")\n");
    }
});

<> P> <强>我的主要问题是如何获取lambda表达式示例并找出与其调用的事件处理相关的实际底层方法或类?< /强>

< p>不幸的是,在lambda表达式用作方法参数的情况下,需要考虑采取功能接口的方法的所有重载版本。参数在本例中,对于
StringProperty.addListener
有以下几种可能性:


  • ChangeListener只需检查lambda传递到的方法。有时您需要做一些额外的工作:
    StringProperty
    有两个
    addListener
    方法,但是lambda的签名只匹配其中一个接口。当然,您可以重用lambda!。
    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));