保持推动和打印两个arraylists值的顺序

时间:2016-12-15 15:58:18

标签: java arraylist webview javafx-webengine jfxpanel

我正在尝试构建一个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

任何人都可以告诉我哪里出错了?提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果您知道调用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));
            }
        });
    }