使用uigetfile而不是uigetdir来获取Matlab中的目录

时间:2011-06-14 20:04:38

标签: user-interface matlab

所以我对MATLAB目录选择gui有疑问。我需要使用GUI来选择目录,但问题是uigetdir接口很糟糕。如果我这样打电话:

blah = uigetfile('C:\...\T2 Measurements');

这就是它告诉我的:

uigetdir results

如你所见,这太可怕了。有大量关于文件系统中文件位置的无关信息,相关信息都在下面。理想情况下,我想指定uigetdir函数使用uigetfile GUI,或者只是将参数传递给uigetfile,告诉它我正在寻找一个目录,而不是单个文件,因为这就是uigetfile GUI的样子:

uigetfile results

但是,当然,这需要我选择一个文件,而不是目录。显然目录没有打开,所以我想我可以让用户选择文件夹中的任何随机文件,我可以获取路径名,但是有更好的方法吗?在另一个应用程序中,我可以想象我的“在文件夹中选择一个文件”解决方法是行不通的。

更新

我对Andrew Janke的代码进行了一些非常小的调整,使其采用与uigetdir()相同的参数。这就是我想出的:

function [pathname] = uigetdir2(start_path, dialog_title)
% Pick a directory with the Java widgets instead of uigetdir

import javax.swing.JFileChooser;

if nargin == 0 || start_path == '' || start_path == 0 % Allow a null argument.
    start_path = pwd;
end

jchooser = javaObjectEDT('javax.swing.JFileChooser', start_path);

jchooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
if nargin > 1
    jchooser.setDialogTitle(dialog_title);
end

status = jchooser.showOpenDialog([]);

if status == JFileChooser.APPROVE_OPTION
    jFile = jchooser.getSelectedFile();
    pathname = char(jFile.getPath());
elseif status == JFileChooser.CANCEL_OPTION
    pathname = [];
else
    error('Error occured while picking file.');
end

3 个答案:

答案 0 :(得分:9)

呸。

您可以通过直接调用Java Swing对象(包括JFileChooser)来绕过uigetdir()并编写自己的小文件选择器函数。这可能是uigetfile()在幕后做的事情。

function [file] = pickDirUsingJFileChooser
%PICKDIRUSINGJFILECHOOSER Pick a dir with Java widgets instead of uigetdir

import javax.swing.JFileChooser;
jchooser = javaObjectEDT('javax.swing.JFileChooser');
jchooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);

status = jchooser.showOpenDialog([]);

if status == JFileChooser.APPROVE_OPTION
    jFile = jchooser.getSelectedFile();
    file = char(jFile.getPath());
elseif status == JFileChooser.CANCEL_OPTION
    file = [];
else
    error('Error occurred while picking file');
end

答案 1 :(得分:4)

我已更改此功能,以便能够同时选择多个文件和文件夹

function [pathname] = uigetdir2(start_path, dialog_title)
% Pick a directory with the Java widgets instead of uigetdir

import javax.swing.JFileChooser;

if nargin == 0 || start_path == '' || start_path == 0 % Allow a null argument.
    start_path = pwd;
end

jchooser = javaObjectEDT('javax.swing.JFileChooser', start_path);

jchooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
if nargin > 1
    jchooser.setDialogTitle(dialog_title);
end

jchooser.setMultiSelectionEnabled(true);

status = jchooser.showOpenDialog([]);

if status == JFileChooser.APPROVE_OPTION
    jFile = jchooser.getSelectedFiles();
    pathname{size(jFile, 1)}=[];
    for i=1:size(jFile, 1)
        pathname{i} = char(jFile(i).getAbsolutePath);
    end

elseif status == JFileChooser.CANCEL_OPTION
    pathname = [];
else
    error('Error occured while picking file.');
end

答案 2 :(得分:0)

基于Andrew Janke's answer我创建了一段使用MATLAB对话框的代码,并为目录启用了多选:

function [files] = uigetdirMultiSelect()

import com.mathworks.mwswing.MJFileChooserPerPlatform;
jchooser = javaObjectEDT('com.mathworks.mwswing.MJFileChooserPerPlatform');
jchooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
jchooser.setMultiSelectionEnabled(true);

jchooser.showOpenDialog([]);

if jchooser.getState() == javax.swing.JFileChooser.APPROVE_OPTION
    jFiles = jchooser.getSelectedFiles();
    files = arrayfun(@(x) char(x.getPath()), jFiles, 'UniformOutput', false);
elseif jchooser.getState() == javax.swing.JFileChooser.CANCEL_OPTION
    files = [];
else
    error('Error occurred while picking file');
end