如何逆向工程Javafx lambda表达式并获取eventHandler和ActionListener的类定义



我正在尽力学习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表达式转换为匿名内类。

相关内容

  • 没有找到相关文章

最新更新