当我使用为地址栏分配的文本字段时,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 三次等等。
您只需添加一次监听器。
您好,我正在开发我的 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 三次等等。
您只需添加一次监听器。