2013-04-22 105 views
2

我正在搜索从服务器加载异步数据的分页示例。我不知道如何通过javafx的分页控制来解决这个问题。那么我有一个例子,其中一个可观察列表在背景中加载了10k个项目。但是我只想在实际需要时加载页面的项目。所以只有当用户切换到下一页时,我想要抓住接下来的20项任务。当任务完成后,页面应呈现..分页内容的异步加载

感谢您的任何建议和帮助!

链接到可观察到的例子: https://forums.oracle.com/forums/thread.jspa?messageID=10976705#10976705

回答

2

所有你需要的是一旦用户在页面上点击启动一个后台线程与你的任务。请参阅下一个使用网站下载以执行长时间任务的示例:

public class Pages extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final Pagination root = new Pagination(urls.length, 0); 

     root.setPageFactory(new Callback<Integer, Node>() { 
      // This method will be called every time user clicks on page button 
      public Node call(final Integer pageIndex) { 
       final Label content = new Label("Please, wait"); 
       content.setWrapText(true); 
       StackPane box = new StackPane(); 
       box.getChildren().add(content); 

       // here we starts long operation in another thread 
       new Thread() { 
        String result; 
        public void run() { 

         try { 
          URL url = new URL(urls[pageIndex]); 
          URLConnection urlConnection = url.openConnection(); 
          urlConnection.setConnectTimeout(1000); 
          urlConnection.setReadTimeout(1000); 
          BufferedReader breader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

          StringBuilder stringBuilder = new StringBuilder(); 

          String line; 
          while ((line = breader.readLine()) != null) { 
           stringBuilder.append(line); 
          } 

          result = stringBuilder.toString(); 
         } catch (Exception ex) { 
          result = "Download failed"; 
         } 

         // once operation is finished we update UI with results 
         Platform.runLater(new Runnable() { 

          @Override 
          public void run() { 
           content.setText(result); 
          } 
         }); 
        } 
       }.start(); 

       return box; 
      } 
     }); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Pages!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private final static String[] urls = {"http://oracle.com", "http://stackoverflow.com", "http://stackexchange~.com", "http://google.com", "http://javafx.com"}; 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

我试过了,它按预期工作。感谢谢尔盖!干杯,吨 – tonimaroni 2013-04-24 14:12:36