Groovy/Java - 文件选择器不使用 JavaFX 或事件线程?

Groovy/Java - File-chooser not using the JavaFX or Event threads?

我正在开发一个应用程序,一段时间内可能只使用命令行。可能有一天适合给它整个 JavaFX 视觉处理:windows、对话框等

我目前需要做的是允许用户从文件系统中的任何地方select files/directories。我这样做的方法是从 JavaFX Application 到 运行 start()在 运行 的开头,所以实际上应用程序在 JavaFX 线程上 运行ning。这意味着,除其他外,该线程允许显示 JavaFX FileChooser,并且还在等待用户 select 文件/目录...

但这似乎大错特错!这不是(至少还不是)"visual" 应用程序。我宁愿用一些简单的东西来处理 "waiting for user input",比如 ExecutorService,并使用普通的 Threads.

我很欣赏文件选择器本身确实是一个 "visual" 功能,并且显然涉及 "event",例如单击 "Select" 按钮:但是为此必须使用整个 JavaFX 基础结构似乎很愚蠢。我想知道是否存在某种更基于打字的东西。

注意我不想使用Swing的JFileChooser:类似的想法适用,Swing已成为过去。

我目前打算做的是通过将所有 FileChooser 功能分割成一个独立的模块来解决问题...但我只是想问问是否有人知道一种方法在这个用例中完全避免使用 JavaFX。

您可以尝试复制一个控制台,例如 CMD 或 Linux 控制台;您从一个文件夹开始,然后可以在 CMD 上使用类似于 cd 的命令移动到其中的文件夹或父文件夹。您可以通过简单地创建一个带有起始路径的 File 对象来完成此操作,然后在输入某个命令时返回,或者进入一个文件夹(如果存在)。

File currDir = new File("starting path");
String input = //INPUT FROM CONSOLE
if(input.equals("back")){
    //GO BACK TO PARENT FOLDER
    currDir = currDir.getParentFile();
}else{
    for(File file : currDir.listFiles()){
        if(file.isDirectory()){
            if(file.getName().equals(input)){
                //GO INTO SELECTED FOLDER
                currDir = file;
            }
        }else if(file.isFile()){
            /*SINCE file.getName() INCLUDES THE FILE EXTENSION YOU'D HAVE TO 
            EITHER PROVIDE THE FILE EXTENSION ALONG THE NAME OF THE FILE 
            WHEN YOU INPUT IT OR SPLIT THE FILE NAME AND EXTENSION FROM 
            THE INPUT BEFORE COMPARING*/
            if(file.getName().equals(input)){
                //THIS IS THE SELECTED FILE, DO WHAT YOU WANT WITH IT
            }
        }
    }
}

尽管根据过去的经验,我真诚地认为使用默认的 FileChooserJFileChooser 效果最好。

PabloJ 的回答让我思考了一下。

特别是 Groovy 使用 Runtime 的选项变得非常实用:

def process = Runtime.runtime.exec( userInputLine )
println "system response: $process.inputStream.text"

注意非Groovy人,runtime来自getRuntime()inputStream来自getInputStream()text来自InputStream 的增强 (GDK) Groovy 版本,它非常方便地向 InputStream 添加了一个方法 getText()。使用纯 Java 你必须参与 StringBuffer、检查 Exceptions

...现在唯一的问题是这个 userInputLine 可能必须是 Windoze 上的 DOS 样式命令(dir 等),但 BASH 命令是Linux(ls 等)(或者有没有办法让 Runtime 在 W10 上使用 Cygwin?嗯……2 分钟后:yes

...所以很明显你可以实现你自己允许的,有限的BASH命令集,包括cd ...然后添加一些"convenience"导航快捷方式和您自己的 "select" 命令,其中显示 "hoover up all the files/directories listed by this selection pattern and process them..."

最后,这里有一个问题,似乎无法更改 Java/Groovy 的工作目录...那么如何 运行 cd?您保留了一个 "synthetic" 工作目录 File,而不是去 exec( command ),而是去 exec( command, null, synthWD )cd 命令必须被拦截并进行相应处理(即更改 synthWD)。