FileChooserDialogBox详解

FileChooserDialogBox

图 FileChooserDialogBox(JUCE默认的文件浏览器)的运行界面

JUCE类库有两种文件浏览器对话框,用于打开文件、另存文件、选择目录等操作,一是FileChooser,另一个是FileChooserDialogBox。FileChooser既可以使用操作系统默认的文件选择对话框,也可内部调用JUCE自带的FileChooserDialogBox。先了解一下FileChooser。

通常临时使用FileChooser的栈对象。流程有3

  1. 声明FileChooser 栈对象,初始化之;
  2. 该对象调用browseFor…() 方法(选择一个或多个文件,打开或另存等等);
  3. 如果返回true,则代表用户选择了文件,可使用getResult()方法获取所选的文件。

示例与详解:

1、“打开多个文件”对话框:

/* 定义并初始化文件选择fc。1参为对话框标题。2参为打开时的初始目录。3参为要打开的文件类型,即文件扩展名,“*”或空字符串为所有类型。4参true为使用操作系统的对话框,false为使用JUCE自带的  */
FileChooser fc (L"打开文件...", File::getCurrentWorkingDirectory(), 
                "*.mp3", true);
/* 判断依据为:是否同时打开多个文件(文件多选)。browseForMultipleFilesToOpen()方法的作用有二。一是弹出文件选择对话框,供打开多个文件所用。二是用户关闭对话框时,如果选择了文件,返回一个bool值true。如果没有选择任何文件,直接关闭了对话框,则返回false。*/
if (fc.browseForMultipleFilesToOpen()) 
{
    // 定义String对象。也可定义一个StringArray,每个元素为一个文件的路径
        String chosen;    

    /* 遍历所选的多个文件,完整路径添加到字符串对象中。此语句有多个知识点:
    1、文件选择器fc调用getResults(),返回Array数组,该数组的元素为文件对象;
    2、文件数组调用getReference(数组下标)方法,返回数组中某个具体的文件;
    3、具体的文件调用getFullPathName()方法,返回该文件的完整路径,含文件名。此结果为字符串。
    4、最终获得的字符串带上换行符,输出给刚刚定义的字符串对象,使用的是重载的<<运算符。
    5、循环结束时,字符串对象中包含了所有文件的路径信息。如果显示输出,则每个文件的信息占一行。
    6、实际编程时,可在此针对每一个打开的文件进行某些判断或处理 */
    for (int i = 0; i < fc.getResults().size(); ++i)
        chosen << fc.getResults().getReference(i).getFullPathName() << "\n";
        // ...
}

2、带图像预览的文件选择对话框。与上面的代码基本一致,所不同的,需先定义一个图像预览对象,设置其大小,而后将此对象作为参数传给browseFor…()函数。示例(略):

3、保存文件对话框。通常用于第一次保存文档,或者文档另存为。思路与做法基本同前,所不同的:

  • browseForFileToSave()方法最好喂一个实参true,用于提示用户,是否确认覆盖保存。
  • 为方便编码,if判断体内最好定义一个文件类对象,初始化为文件选择对象的返回值。

示例略。

4、选择目录或新建目录对话框。思路与编码基本同上。if判断中换成对应的方法即可。示例略。

需注意,以上文件选择类对话框,都是模态窗口,为确保代码跨平台后不出现问题(主要是Android平台),要使用模态条件宏进行包裹。其他模态组件同理。

// 模态组件的条件宏
#if JUCE_MODAL_LOOPS_PERMITTED
    // ...和模态组件有关的代码...
#endif

FileChooser类的成员函数一览:(略)

注意两点

  1. FileChooser类没有继承任何基类,是一个独立的类
  2. 如需使用JUCE默认的文件浏览器(打开或保存对话框),则使用FileChooserDialogBox。

FileChooserDialogBox的继承层次为(子类->父类):

FileChooserDialogBox —> ResizableWindow —> ToplevelWindow —> Component

ResizableWindow有两个派生类,一个是DocumentWindow,另一个是FileChooserDialogBox。

FileChooserDialogBox的使用流程有二

  1. 内容组件类的功能性函数中,临时创建该类的栈对象
  2. 创建后,调用show()。该函数返回bool值,基于返回值获取所选的文件或进行其他处理

示例代码

// 先定义一个文件扩展名过滤对象
WildcardFileFilter wildcardFilter ("*.wav", String::empty, "wav audio");

// 再定义一个文件浏览组件
FileBrowserComponent browser (FileBrowserComponent::openMode | 
                              FileBrowserComponent::canSelectFiles,
                              File::nonexistent, &wildcardFilter, nullptr);
   // 创建文件选择对话框
   FileChooserDialogBox dialogBox ("Open some kind of file",
             "Choose file to open...", browser, false, Colours::lightgrey);

if (dialogBox.show()) 
    File selectedFile = browser.getSelectedFile (0);