在推送和打印两个数组列表的值时保持顺序
Maintaining sequence in pushing and printing values of two arraylists
我正在尝试构建一个 Web 浏览器,并且我正在使用 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);
}
因此,如果满足 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));
}
});
}
我正在尝试构建一个 Web 浏览器,并且我正在使用 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);
}
因此,如果满足 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));
}
});
}