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

问题描述 投票:1回答:1

我正在尽力学习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 + ")\n");
    }
});

并且能够成功地将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表达式示例并找出与其调用的事件处理相关的实际底层方法或类?

javafx lambda event-handling actionlistener eventhandler
1个回答
3
投票

不幸的是,在lambda表达式用作方法参数的情况下,您需要考虑将函数接口作为参数的方法的所有重载版本。在这种情况下,StringProperty.addListener有以下可能性:

  • ChangeListener<? super String>
  • InvalidationListener

现在检查这些接口的抽象方法是否具有合适的签名。

在这种情况下,InvalidationListener.invalidated只采用一个参数来消除它作为可能性。 ChangeListener.changed有3个参数,这意味着签名是合适的......

但是,某些IDE应该提供自动执行此功能的功能。例如。 NetBeans 8在代码行旁边显示一个灯泡,如果将光标放在lambda表达式中并单击它,则显示选项Use anonymous inner class,它自动将lambda表达式转换为匿名内部类。

© www.soinside.com 2019 - 2024. All rights reserved.