2

サーバーからデータを非同期にロードするためのページネーションの例を検索しています。javafxのページネーション制御でそれを解決する方法がわかりません。さて、監視可能なリストがバックグラウンドで10kのアイテムでロードされる例があります。しかし、実際に必要なときにのみページのアイテムをロードしたいのです。したがって、ユーザーが次のページに切り替えたときにのみ、タスクで次の 20 項目を取得したいと考えています。タスクが完了すると、ページがレンダリングされます。

アドバイスや助けをありがとう!

観察可能な例へのリンク: https://forums.oracle.com/forums/thread.jspa?messageID=10976705#10976705

4

1 に答える 1

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);
    }
}
于 2013-04-24T12:44:36.367 に答える