fileChooser.showOpenMultipleDialog()太慢并且在选择大量文件时挂起

时间:2015-01-12 13:42:16

标签: java javafx filechooser

我选择了大约800个图像文件,每个图像文件的大小为5 MB,使用以下代码:

List<File> flist = fileChooser.showOpenMultipleDialog(label.getScene().getWindow());

当我点击打开时,filechooser和主窗口冻结(并且不响应)。

我该怎么做才能改善这个问题? (我不想使用Swing。)

我的代码用于将图像文件名列表添加到tableView。不适用于加载图片。运行此代码后,我将在终端中获得输出:

Total Files added: 800.

filechooser和主窗口冻结(并且不响应)

public void addImage()
{
    int i = 0;
    List<File> list = fileChooser.showOpenMultipleDialog(label.getScene().getWindow());
    if (list != null) {
        for (File f : list) {
            data.add( new ImgInfo(1 + data.size() + "", f));
            i++;
        }
        System.out.println("Total Files added: " + i);
    }
}

2 个答案:

答案 0 :(得分:0)

我假设您正在进行一个图像处理项目,您实际上并不需要查看所有输入图像。如果所有文件都在一个文件夹中,我建议采用以下方法:

public void filesInFolder(File folder) {
    for (File file : folder.listFiles()) {
        if (fileEntry.isFile()) {
            // Open File Here
        } 
    }
}

答案 1 :(得分:0)

fileChooser.showOpenMultipleDialog()不会挂起,使用时不会太慢。

这是我使用的示例应用程序。选择几千个文件并在ListView中显示其名称只需不到一秒钟。测试环境:JavaFX 8u20,Windows 7,6岁PC。

filelist

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

import java.io.File;
import java.util.List;

public class SelectedFileInfoViewer extends Application {
    @Override public void start(final Stage stage) throws Exception {
        final ListView<File> chosenFilesView = new ListView<>();

        final Button chooseFilesButton = new Button("Choose Files");
        chooseFilesButton.setOnAction(event -> {
            List<File> files = new FileChooser().showOpenMultipleDialog(stage);
            if (files != null) {
                chosenFilesView.getItems().setAll(files);
            }
        });

        final Label numFilesChosen = new Label();
        numFilesChosen.textProperty().bind(
                Bindings.concat(
                        "Number of Files: ",
                        Bindings.size(
                                chosenFilesView.getItems()
                        ).asString()
                )
        );

        VBox layout = new VBox(
                10,
                chooseFilesButton,
                chosenFilesView,
                numFilesChosen
        );
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }
    public static void main(String[] args) { launch(args); }
}