繁体   English   中英

如何在 JavaFX 中使用 lambda 表达式调用动作事件的方法

[英]How to call a method on an action event using lambda expression in JavaFX

我正在学习 JavaFx,所以我从一个使用 JDBC 的非常基本的数据库应用程序开始。 我是一名网络开发人员,我来自 Javascript 和 Typescript 背景。 我正在尝试通过单击按钮来调用方法。 该方法将简单地在数据库中推送一条记录。 我先给你看我的代码。

添加NewBranchRecord.java

public class AddNewBranchRecord {

    public static void askInitialDetails() {
        Scene scene;
        final Stage stage = new Stage();

        Button doneButton;
        ...

        doneButton = new Button("Done");
        doneButton.setOnAction(e -> {
            DataService dataservice = new DataService();
            dataservice.insertRecord();
        });

        ...

        stage.setTitle("INITIAL DETAILS");
        stage.setScene(scene);
        stage.showAndWait();
    }
}

这是将与 oracle 交互的数据服务类。

数据服务.java

public class DataService {
    Connection con;
    Statement stmt;

    DataService() {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","tiger","scott");
            stmt=con.createStatement();
        }
        catch(Exception e){ 
            System.out.println(e);
        }
    }

    public int insertRecord() {
        int success = 0;
        try {
            success=stmt.executeUpdate("insert into emp values(2, 'Tanzeel')");
        } catch (SQLException ex) {
            Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex);
        }
        return success;
    }
}

但是当我按下“完成”按钮时,它给了我这个例外:

线程“JavaFX 应用程序线程”中的异常 java.lang.NoSuchMethodError: tasktracker.DataService.insertRecord()Z

为什么我会收到此NoSuchMethod异常。 如果我将此代码直接放入调用者类的构造函数中,则相同的代码有效。 是否有与同步相关的东西。 我是这样想的,因为我来自 Javascript 和 Typescript 背景。 我知道 Java 和 JS 是两种不同的语言。 请指出我的错误。

我正在使用JDK 8

发生这种情况的唯一方法是,如果DataService类是在没有addRecord()方法的情况下编译的,并且在添加了addRecord()方法后没有重新编译。 通常,编译器会确保不会发生这种情况(通过在编译AddNewBranchRecord时自动重新编译DataService ),但不知何故似乎事情不同步了。

最好的办法是删除所有生成的类文件并重新编译源代码。 您的 IDE 应该可以选择“清理”和“重建”项目,以分别完成这些步骤。

DataService一句,您几乎肯定不希望每次用户按下按钮时都创建一个新的DataService (连接到数据库):将调用移动到 lambda 表达式之外的DataService构造函数(至少;您可以希望它的范围更广)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM