Поддержание последовательности в толкании и печати значений двух массивов

Я пытаюсь создать веб-браузер и использую 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));
            }
        });
    }
Другие вопросы по тегам