2

JavaFX Platform スレッドと標準 Java スレッドを同期する方法はありますか? 現在、トリガーされると、JavaFX スレッドは、標準の Java スレッドが監視可能なリストへのすべての画像の追加を完了する前に起動するため、imageList は空のコレクションで更新されます。

private final TilePane imageList;
final File[] files = new File(dir).listFiles();
final List<ImageView> views = FXCollections.observableArrayList();

new Thread() {
        @Override
        public void run() {
            for (final File file : files) {
                if (Utils.fileIsImage(file) && !file.isDirectory()) {
                    ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
                    views.add(view);
                }
            }
        }
    }.start();
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            imageList.getChildren().addAll(views);
        }
    });

私はJavaFXと並行性に比較的慣れておらず、スレッドロックの経験がないので、どんな助けも素晴らしいでしょう. ありがとう!

4

1 に答える 1

4
new Thread() {
    @Override
    public void run() {
        for (final File file : files) {
            if (Utils.fileIsImage(file) && !file.isDirectory()) {
                ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
                views.add(view);
            }
        }

        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                imageList.getChildren().addAll(views);
            }
        });
    }
}.start();

ロードされている限り、ビューを1つずつ追加することを検討してください。

if (Utils.fileIsImage(file) && !file.isDirectory()) {
    ImageView view = new ImageView(new Image("file:" + file, 72, 72, false, true));
    views.add(view);

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            imageList.getChildren().add(view);
        }
    });
}
于 2012-11-07T06:59:42.290 に答える