Как вызвать метод для события действия, используя лямбда-выражение в JavaFX - PullRequest
0 голосов
/ 23 февраля 2020

Я изучаю JavaFx, поэтому я начал с очень простого c приложения базы данных, используя JDB C. Я веб-разработчик, и я из Javascript и из Typescript. Я пытаюсь вызвать метод по нажатию кнопки. Этот метод просто сделает запись sh в базе данных. Сначала я покажу вам свой код.

AddNewBranchRecord. 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.

DataService. 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.

1 Ответ

3 голосов
/ 23 февраля 2020

Единственный способ, которым это может произойти, - это если класс DataService был скомпилирован без метода addRecord() и не перекомпилирован после добавления метода addRecord(). Обычно компилятор гарантирует, что этого не произойдет (путем автоматической перекомпиляции DataService при компиляции AddNewBranchRecord), но почему-то кажется, что все вышло из-под контроля c.

Ваша лучшая ставка здесь удалить все сгенерированные файлы классов и перекомпилировать ваш исходный код. Ваша IDE должна иметь опции «Очистить» и «Перестроить» проект, чтобы выполнить sh эти шаги соответственно.

Кроме того, вы почти наверняка не хотите создавать новый DataService (с подключением к базе данных) каждый раз, когда пользователь нажимает кнопку: перемещайте вызов в конструктор DataService за пределами лямбда-выражения (по крайней мере, вы можете захотеть, чтобы его охват был еще шире).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...