【问题标题】:fileChooser.showOpenMultipleDialog() tooo slow and hang when choosing lot of files选择大量文件时,fileChooser.showOpenMultipleDialog() 太慢并挂起
【发布时间】:2015-01-12 13:42:16
【问题描述】:

我选择了大约八百个图像文件,每个文件大小为 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);
    }
}

【问题讨论】:

  • 您可能应该寻找另一种方法来打开如此大量的文件?
  • 实际花费的时间是什么?我可以使用FileChooser 来检索大约 10,000 个文件的列表,而无需挂起 UI。您是否尝试将每个文件加载到 Image 中?您可能需要发布更多代码并显示 UI 实际挂起的位置。

标签: java javafx filechooser


【解决方案1】:

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

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

【讨论】:

  • 我需要从一个文件夹中选择多个文件,而不是所有文件。
  • 可以修改循环中的if条件来选择你要打开的具体文件。
【解决方案2】:

fileChooser.showOpenMultipleDialog()我用的时候不会挂,也不会太慢。

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

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); }
}

【讨论】:

  • 这段代码也为我挂起。我在 Ubuntu 12.04 上使用 Java8。
  • 等了很久,一切正常。这是linux中javafx filechooser的bug吗?
  • 由于您的问题似乎是特定于环境的,您可能希望在 JavaFX 问题跟踪器中记录问题:javafx-jira.kenai.com 以便 JavaFX 开发人员可以调查它,当您记录问题时可以参考回到这个 StackOverflow 答案。
  • 对我来说它也挂了....我试图做我的东西多线程,但后来我意识到它是 DirectoryChooser
  • @El Mac 在bugreport.java.com 记录错误报告,确保在错误报告中包含完整的环境详细信息(操作系统/Java 版本/显卡/显卡驱动程序版本)。跨度>
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多