[英]Maintaining sequence in pushing and printing values of two arraylists
我正在嘗試構建網絡瀏覽器,並且正在使用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
誰能告訴我我哪里出錯了? 提前致謝。
如果您知道調用2個偵聽器的時間順序(例如始終始終調用titleProperty偵聽器),則可以檢查第二個偵聽器的第一個列表的長度,並且僅在第一個偵聽器的列表為時才添加內容第二個偵聽器列表中的元素大1個元素
這是解決方案的重要部分
if (title.size() == titleUrl.size() + 1) {
titleUrl.add(newValue);
}
因此,如果滿足兩個條件,則此解決方案將起作用
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));
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.