2017-05-30 35 views
0

我有兩種方法。第一個檢索另一個類中搜索方法的結果列表。我可以一次更新我的TableView項目而不阻塞UI線程嗎?

/* 2 - Retrieve list of results */ 
qmitResultsList = QMITSearchUtil.execute(URL, keyword); 

/* 3 - Show results */ 
populateTable(qmitResultsList, tableView) 

第二,populateTable()通過調用將所有的項目表中的一次:

ObservableList<QMITResult> dataPriority = FXCollections.observableArrayList(
     qmitResultsList 
); 
tableView.setItems(dataPriority); 

我的目標是每一個新的元素添加到TableView中,因爲它是在實時被處理。例如,我不想在第一種方法中處理並返回整個列表QMITSearchUtil.execute(),而是想每次更新返回的每個結果的UI。這如何實現?我嘗試了幾種方法,例如使用Platform.runLater()黑客,但沒有成功......

+1

您可以通過在後臺線程中檢索結果並將其添加到Platform.runLater()中的表中來進行此操作(假設不會頻繁地調用Platform.runLater(...) 。你爲什麼將'Platform.runLater(...)'作爲黑客?這基本上就是它所設計的。 –

+0

我會嘗試檢索我所做的並顯示我所嘗試的內容。 – santafebound

+0

'populateTable(qmitResultsList,tableView)':這看起來像你正在更新支持'ObservableList'的列表而不是'ObservableList'本身,導致沒有通知被'ObservableList'觸發,這意味着'TableView'獲勝't'看到「任何改變(除非你永遠不修改列表,只更新已經在列表中的元素)... – fabian

回答

0

我發現了我的問題的答案。我首先定義ObservableList我的TableView:

ObservableList<QMITResult> dataPriority = FXCollections.observableArrayList(); 

然後,我傳遞到運行的後臺線程的​​方法:

private void execute(String URL, String keyword, ObservableList<QMITResult> dataPriority) throws Exception { 

     /* Download HTML page and create list of URLs from relevant links */ 
     Elements links = getLinkList(URL); 

     List<QMITResult> qmitResults = new ArrayList<>(); 

     new Thread(() -> { 
      for (Element link : links) { 
       try { 

        /* Create a list of formatted URLs to loop through */ 
        String linkText = link.toString(); 
        String titleText = link.text(); 
        String formattedLink = StringUtils.substringBetween(linkText, "<a href=\"", "\"").replace("\\", "/"); 

        System.out.println(titleText); 
        System.out.println(formattedLink); 

        /* Create Word Document for each link and parse for keyword */ 
        QMITResult qmitResultNode = null; 
        try { 
         qmitResultNode = parseDocument(keyword, formattedLink, titleText); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        qmitResults.add(qmitResultNode); 
        dataPriority.add(qmitResultNode); 
        Thread.sleep(200); 


       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 

     tableView.setItems(dataPriority); 

    } 

的結果是,雖然該名單正在形成各自的TableView項目正在單獨發佈而不會阻塞主UI線程。他們每次來一個。

+1

這是我的問題的答案。我只是在努力工作而已。 – santafebound

+0

好的。我以爲你正在更新你的問題。抱歉! – Sedrick

+0

那麼,答案是不正確的。您正在從後臺線程更新UI,這是JavaFX線程規則所不允許的。您需要在'Platform.runLater(...)'中將調用包裝爲'dataPriority.add(qmitResultNode)'。 –

相關問題