【问题标题】:Empty Arraylist JavaFX空数组列表 JavaFX
【发布时间】:2016-02-16 18:26:41
【问题描述】:

我有这样一个简单的方法:

public ArrayList<String> getImagefromGoogleUrl() {

        total = "http://www.google.it/search?q=&hl=it&gbv=2&tbm=isch&prmd=ivnsm&ei=5qW8Vua9Dsb-Pa36h7gH&start=0&sa=N";
        String stringa = "casa";
        total = total.replaceAll("q=", "q=" + stringa);

        resultList = new ArrayList<>();
        webview = new WebView();
        final WebEngine webengine = webview.getEngine();

        webengine.documentProperty().addListener((obs, oldDoc, newDoc) -> {
            if (newDoc != null) {
                nodeList = newDoc.getElementsByTagName("img");
                for (int i = 0; i < 10; i++) {
                    Element img = (Element) nodeList.item(i);
                    src = img.getAttribute("src");
                    resultList.add(src);
                    System.out.println("resultList è grande"+resultList.size());
                     System.out.println("resultlist vale"+resultList);
                    // System.out.println(src);
                }

            }
            else
                System.out.println("ciao");


        });
        webengine.load(total);
        System.out.println("resultList prima del return è grande"+resultList.size());
        return resultList;

    }

我使用webengine 对象进行查询,其中字符串为total,然后我将图像的每个路径(查询是关于图像研究)放入ArrayList。元素是正确的,但是当我调用函数getImagefromGoogleUrl() 并尝试获取大小时,我得到[]。一个更清楚的例子:

ArrayList<String> prova = getImagefromGoogleUrl();

        if(prova.size()!=0)
        {
        System.out.println("prova size is"+prova.size());
        listaimmagini.addAll(prova);
        }

所以这样arraylist prova是空的,我不明白为什么?

【问题讨论】:

  • 当您从函数中return resultList 时,它是否包含正确的值?
  • 不,return resultList; 之前的打印 System.out.println("resultList prima del return è grande"+resultList.size()); 返回 0。我只在 for 循环内得到正确的值。

标签: java string arraylist javafx


【解决方案1】:

WebEngine.loadJavadoc 说:

将网页加载到此引擎中。此方法异步启动 加载并立即返回。

因此,当尚未调用填充列表的回调时,您可以使用该列表。


解决方案是不返回列表,而是接受 Consumer&lt;List&gt; 并在填写完列表后调用它:

public void getImagefromGoogleUrl(Consumer<ArrayList<String>> consumer) {
    ...
    webengine.documentProperty().addListener((obs, oldDoc, newDoc) -> {
        ... fill list
        // no pass it to the consumer
        consumer.accept(resultList); 
    });
}

并像使用它

getImagefromGoogleUrl(prova -> {
    if (prova.size() != 0) {
         System.out.println("prova size is" + prova.size());
         listaimmagini.addAll(prova);
    }
});

【讨论】:

  • 对不起,我不明白。你能举个例子吗?
  • @user5913892 (1) 你打电话给WebEngine.load。 (2) 加载从另一个线程开始 (3) 你从getImagefromGoogleUrl 返回并看到一个空列表 (4) 加载完成,你的监听器被调用并填充列表但都是徒劳的。
  • 那么,你是说我必须创建一个单独的线程来填充列表吗?
  • 谢谢,它有效。我要研究你的解决方案,我从不使用消费者,所以我必须学习如何使用它。
猜你喜欢
  • 2015-01-31
  • 2017-09-23
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2016-12-15
  • 2017-01-30
  • 2013-12-26
相关资源
最近更新 更多