2011-06-14 22 views
6

में निर्देशिका प्राप्त करने के लिए uigetdir के बजाय uigetfile का उपयोग करना तो मुझे MATLAB निर्देशिका चयन gui के बारे में कोई प्रश्न है। मुझे एक निर्देशिका का चयन करने के लिए एक जीयूआई का उपयोग करने की आवश्यकता है, लेकिन समस्या यह है कि uigetdir इंटरफ़ेस भयानक है। अगर मैं इस तरह कहते हैं:मैटलैब

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

यह वही है यह मुझे पता चलता है:

uigetdir results

आप देख सकते हैं, इस भयंकर है। फाइल सिस्टम में फ़ाइल के स्थान के बारे में अतिरिक्त जानकारी का एक टन है और प्रासंगिक जानकारी गुना के नीचे है। आदर्श रूप में, मैं यह निर्दिष्ट करना चाहता हूं कि uigetdir फ़ंक्शन यूगेटफाइल जीयूआई का उपयोग करता है, या सिर्फ यूगेटफाइल को यह तर्क दे रहा है कि मैं एक निर्देशिका की तलाश में हूं, एक फ़ाइल नहीं, क्योंकि यह यूगेटफाइल जीयूआई जैसा दिखता है:

uigetfile results

लेकिन निश्चित रूप से, यह जरूरी है कि मैं एक फ़ाइल, नहीं एक निर्देशिका का चयन करें। स्पष्ट रूप से निर्देशिकाएं खुली नहीं हैं, इसलिए मुझे लगता है कि मैं उपयोगकर्ता को फ़ोल्डर में किसी भी यादृच्छिक फ़ाइल का चयन कर सकता हूं और मुझे पथनाम मिल सकता है, लेकिन क्या ऐसा करने का एक बेहतर तरीका है? एक और आवेदन में, मैं कल्पना कर सकता था कि मेरी "फ़ोल्डर में एक फ़ाइल का चयन करें" वर्कअराउंड काम नहीं करेगा।

अद्यतन

मैं इसे uigetdir रूप में एक ही तर्क ले बनाने के लिए() एंड्रयू Janke के कोड में कुछ बहुत ही मामूली समायोजन कर दिया। यहां मैं ये आया हूं:

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 
+0

@ user1740374 आप एक प्रश्न संपादित करके टिप्पणी नहीं कर सकते। जब आप पर्याप्त प्रतिष्ठा कमाते हैं तो टिप्पणी आपके लिए उपलब्ध होगी। – keyser

उत्तर

9

यक।

आप uigetdir() को बाईपास कर सकते हैं और JFileChooser सहित जावा स्विंग ऑब्जेक्ट्स को सीधे कॉल करके अपना स्वयं का छोटा फ़ाइल चयनकर्ता फ़ंक्शन लिख सकते हैं। जो संभवतः यूगेटफाइल() हुड के नीचे कर रहा है।

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 
+0

+1 विंडोज मूल फ़ोल्डर चयनकर्ता संवाद के लिए अच्छा विकल्प – Amro

4

मैं इस समारोह को बदल दिया है मैं कोड का एक टुकड़ा जो MATLAB संवाद का उपयोग करता है और बहु ​​के लिए सक्षम बनाता बनाई गई एक ही समय

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 
+0

आपका कोड पहले पैरामीटर के लिए काम नहीं करता है, 'uigetfilesanddirs (' C: \ ')' 'का प्रयास करें। आपकी 'स्टार्टपाथ ==' तुलना एरे वापस लौटती है, जो आप नहीं चाहते हैं! –

+0

मेरे लिए काम करें। सरल और महान! – Adiel

0

Andrew Janke'sanswer के आधार पर में एकाधिक फ़ाइलों और फ़ोल्डर्स का चयन करने में सक्षम हो निर्देशिकाओं के लिए चयन करें:

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