当前位置: 首页 > 知识库问答 >
问题:

Java 8 Lambda表达式从action事件匿名内部类调用特定方法[duplicate]

阎阎宝
2023-03-14

我在JPanel上有一个文本字段,这个文本字段上有一个文档侦听器。由于文档侦听器包含三个方法(removeUpdate,insertUpdate,changeUpdate),所以如何使用Lambda表达式调用特定方法。

    field.getDocument().addDocumentListener(new DocumentListener() {

        @Override
        public void removeUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public void insertUpdate(DocumentEvent arg0) {
            // TODO Auto-generated method stub
            button.setText(field.getText());
        }

        @Override
        public void changedUpdate(DocumentEvent arg0) {


        }

    });

如何使用像field.getDocument()这样的Lambda表达式调用此文档侦听器insertUpdate方法。AddDocumentListener(Lambda表达式);

共有1个答案

能逸清
2023-03-14

为了使lambda充当特定接口的实例,该接口必须具有单个抽象方法。

DocumentListener有3个Abstract方法,因此您需要创建一个SMI,扩展DocumentListener:

interface InsertListener extends DocumentListener {
    @Override
    default void removeUpdate(DocumentEvent e) {
    }

    @Override
    default void changedUpdate(DocumentEvent e) {
    }
}

现在您可以使用lambda表达式创建InsertListener的实例:

final InsertListener is = e -> button.setText(field.getText());

您可以将其传递到一个方法中:

field.getDocument().addDocumentListener(is);

例如,您还可以创建一个接口如下所示:

interface InsertListener extends DocumentListener {

    void onEvent(DocumentEvent.EventType type, DocumentEvent e);

    @Override
    default void insertUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void removeUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }

    @Override
    default void changedUpdate(DocumentEvent e) {
        onEvent(e.getType(), e);
    }
}
final InsertListener is = (t, e) -> {
    if (t == DocumentEvent.EventType.INSERT) {
        button.setText(field.getText());
    }
};
 类似资料:
  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 问题内容: 最近,我遇到了一个神秘的问题,在Android项目,我描述了这里。我以某种方式解决了问题,但仍然不知道其背后的确切原因。 假设我想在内部类中调用函数foo()。问题是,直接调用它有什么区别 或使用外部类实例对其进行调用 此外,如果有人能检查我与此相关的最后一个问题,并向我提供有关错误发生原因的线索,我将不胜感激。非常感谢。 PS:我在某处读到,非静态内部类将始终持有外部类的实例。因此,

  • 问题内容: 好的,所以我知道匿名内部类正在隐式扩展父类或实现接口,因此将需要调用超类的构造函数。但是,我不确定如何为匿名类创建一个构造函数(如果可能的话),并且在没有定义构造函数的情况下,我不确定如何对super()进行调用!这是我的练习代码: 我担心的是,如果您尝试从没有no- arg构造函数的类中创建一个匿名类,则该代码将在编译时失败,因为无法将参数传递给超构造函数。这是一个有效的问题吗?如果

  • 在以下片段中: 有没有办法从内部匿名类引用匿名类的外部实例? 第二个错误是在解决方案上,我在这里找到了一个匿名内部类的外部类的关键字。这些问题似乎共享一些概念和问题空间,但性质不同。

  • 我有一个正在测试的类,其中包含一个具有内部匿名类的方法。匿名类中的一个方法调用了被测试类中的一个方法,但Mockito似乎没有意识到这一点。 我的测试代码: 出于某种我似乎无法弄清楚的原因,Mockito无法检测到正在调用outerMethod(),尽管我已经通过在调试器中逐行手动验证。我还验证了对依赖对象的调用返回具有正确内容的正确可观察对象,并且确实调用了on完成()和outerMethod(