当我使用为地址栏分配的文本字段时,Javafx webhistory 条目会插入重复的浏览历史记录

Javafx webhistory entries insert duplicate browsing histories when I use the textfield assigned for addressbar

您好,我正在开发我的 Web 浏览器 javafx 项目,我将浏览历史记录存储到 mysql。有一个错误,每次我使用地址栏浏览新网站时,历史条目都会插入重复项。

这是收集数据并将数据发送到 MySQL 的代码。

private void collectData() {
    WebHistory history = web.getEngine().getHistory();
    ObservableList<WebHistory.Entry> entries = history.getEntries();
    DatabaseConnection connectNow=new DatabaseConnection(); 
    
    try {
        connectDB = connectNow.getConnection();
    } catch (SQLException e1) {
        e1.printStackTrace();
    }
    
    String insertTrackData="INSERT INTO `trackdata` (username, sitename, date) VALUES ('"+Session.getSessionUser()+"','"+entries.get(history.getCurrentIndex()).getUrl()+"','"+entries.get(history.getCurrentIndex()).getLastVisitedDate()+"');";
    System.out.println(insertTrackData);
        
    try {
        Statement statement = connectDB.createStatement();
        statement.executeUpdate(insertTrackData);
        
    } catch (Exception e) {
        e.printStackTrace();
        e.getCause();
    }
}

我想知道这段代码是否是下面的罪魁祸首

@FXML
private void load(ActionEvent event) {
    web.prefHeightProperty().bind(mainWindow.heightProperty());
    web.prefWidthProperty().bind(mainWindow.widthProperty());
    
    if(!addressBar.getText().contains("https://")) {
        web.getEngine().load("https://" + addressBar.getText());
    } else if(addressBar.getText().contains("https://")) {
        web.getEngine().load(addressBar.getText());
    }
    WebEngine webEngine = web.getEngine();
    
    webEngine.getLoadWorker().stateProperty().addListener((obs, oldValue, newValue) -> {
        if (newValue == Worker.State.SUCCEEDED) {
            WebHistory history = web.getEngine().getHistory();
            ObservableList<WebHistory.Entry> entries = history.getEntries();
            addressBar.setText(entries.get(history.getCurrentIndex()).getUrl());
            
            Stage stage = (Stage) addressBar.getScene().getWindow();
            stage.setTitle(entries.get(history.getCurrentIndex()).getTitle());
            collectData();
        } else if (newValue == Worker.State.FAILED) {
            System.out.println("Loading failed");
        }
     });
}

控制台显示如下:

插入 trackdata(用户名、网站名、日期)值('m'、'https://www.google.com.hk/'、'Fri Nov 19 10:48:34 CST 2021');

插入 trackdata(用户名、网站名、日期)值('m'、'https://edition.cnn.com/'、'Fri Nov 19 10:48:55 CST 2021');

插入 trackdata(用户名、网站名、日期)值('m'、'https://edition.cnn.com/'、'Fri Nov 19 10:48:55 CST 2021');

插入 trackdata(用户名、网站名、日期)值('m'、'https://www.imdb.com/'、'Fri Nov 19 10:49:17 CST 2021');

插入 trackdata(用户名、网站名、日期)值('m'、'https://www.imdb.com/'、'Fri Nov 19 10:49:17 CST 2021');

插入 trackdata(用户名、网站名、日期)值('m'、'https://www.imdb.com/'、'Fri Nov 19 10:49:17 CST 2021');

请注意,只有当我在地址栏中输入新地址时,该值才会重复。

每次调用方法 load 时,您都会将 另一个 侦听器添加到相同的 state 属性相同 WebEngine 并且每个侦听器都执行。这就是为什么您的控制台显示第一个 URL 一次,第二个 URL 两次,第三个 URL 三次等等。

您只需添加一次监听器。