Поддержание последовательности в толкании и печати значений двух массивов
Я пытаюсь создать веб-браузер и использую WebView для получения веб-страниц. Мне нужно получить как URL, так и название заголовка для хранения истории.
Итак, я попытался таким образом:
private void currentScene() {
Platform.runLater(new Runnable() {
@Override
public void run() {
WebView view = new WebView();
engine = view.getEngine();
engine.createPopupHandlerProperty();
engine.titleProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (newValue != null) {
//stores the title name in an arraylist
title.add(newValue);
}
}
});
}
});
engine.locationProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//stores the URL in another arraylist
titleUrl.add(newValue);
//sets the text of the location text field
locationTextField.setText(newValue);
}
});
}
});
jfxPanel.setScene(new Scene(view));
}
});
}
Я распечатал значения:
for (int i = 0; i < title.size(); i++) {
System.Out.Println(title.get(i)+" : "+titleUrl.get(i));
}
Но мой вывод похож
Google : http://www.yahoo.com
Yahoo : http://www.google.com
Может кто-нибудь сказать, пожалуйста, где я ошибся? Заранее спасибо.
1 ответ
Если вы знаете порядок, когда вызывается один из двух слушателей (например, слушатель titleProperty всегда вызывается первым), тогда вы можете проверить на втором слушателе длину первого списка и добавить к нему материал, только если список первого слушателя больше на 1 элемент из списка второго слушателя
вот важная часть решения
if (title.size() == titleUrl.size() + 1) {
titleUrl.add(newValue);
}
Так что это решение будет работать, если выполнены 2 условия
1) всегда запускаются оба события (нет случая, чтобы было запущено только одно событие)
2) всегда оба события запускаются в том же порядке, что и обработчик titleProperty, затем слушатель locationProperty
вот полный код
private void currentScene() {
Platform.runLater(new Runnable() {
@Override
public void run() {
WebView view = new WebView();
engine = view.getEngine();
engine.createPopupHandlerProperty();
engine.titleProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, final String newValue) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (newValue != null) {
//stores the title name in an arraylist
title.add(newValue);
}
}
});
}
});
engine.locationProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> ov, String oldValue, final String newValue) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
//stores the URL in another arraylist
if (title.size() == titleUrl.size() + 1) {
titleUrl.add(newValue);
}
//sets the text of the location text field
locationTextField.setText(newValue);
}
});
}
});
jfxPanel.setScene(new Scene(view));
}
});
}