2016-12-15 20 views
-1

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

,如果你知道调用2个监听器的时间顺序(例如,titleProperty监听器总是先调用),那么您可以检查第二个监听器的第一个列表的长度,并且只在第一个监听器的列表增大1个元素时才添加内容从第二位听众的名单。 – Hani

+0

你可以在你的答案中显示吗? – IAmBlake

回答

1

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

非常感谢!这是我正在寻找的解决方案:) – IAmBlake