2014-12-31 143 views
1

我想知道它有一種方法可以將文件從Windows資源管理器拖放到我的GUI中。Matlab從Windows資源管理器拖放文件到圖(gui)

目標應該是獲取文件路徑(或文件夾路徑),並能夠使用我自己的加載函數加載它。

我確定我在Windows 10 64位中使用了Matlab 2015b。

編輯我的帖子給的什麼,我試圖做一個代碼示例(基於亞伊爾奧特曼的解決方案和其他在網上查到):

function demo 

    % Set-up a figure droppable axis 
    hFig = figure('name','DND example','numbertitle','off'); 
    hAx1 = axes('position',[.1,.1,.8,.8]); 

    % Enable drop on the figure axis 
    dnd = handle(java.awt.dnd.DropTarget(),'callbackProperties'); 
    jFrame = get(hFig,'JavaFrame'); 
    jAxis = jFrame.getAxisComponent; 
    jAxis.setDropTarget(dnd); 
    set(dnd,'DropCallback',{@dndCallbackFcn,hFig, hAx1}); 
    set(dnd,'DragOverCallback',@dndCallbackFcn); 

end 

function dndCallbackFcn(varargin) 

    persistent transferable 
    eventData = varargin{2}; 
    if eventData.isa('java.awt.dnd.DropTargetDropEvent') %nargin>2 
     hFig = varargin{3}; % my figure is passed as the third argument 

     try 
      eventData.acceptDrop(eventData.getDropAction); 
      transferable = eventData.getTransferable; 
     catch 
     end 


     dataFlavorList = java.awt.datatransfer.DataFlavor.javaFileListFlavor; 
     fileList = transferable.getTransferData(dataFlavorList); 

     %{ 
      I want here to get back the file path and then call my loading function 
     %} 
    end 
end 

我一直在該行得到一個錯誤:

fileList = transferable.getTransferData(dataFlavorList); 

的錯誤是:

Java exception occurred: 
java.awt.dnd.InvalidDnDOperationException: No drop current 

at sun.awt.dnd.SunDropTargetContextPeer.getTransferData(Unknown Source) 

at sun.awt.datatransfer.TransferableProxy.getTransferData(Unknown Source) 

at java.awt.dnd.DropTargetContext$TransferableProxy.getTransferData(Unknown Source) 
+0

您可以編寫一個實現了功能的java組件,並使用'javacomponent'加載它。在這裏解釋:http://undocumentedmatlab.com/blog/javacomponent – Daniel

+0

如果您要拖放一個mfile以將其打開,請將其拖放到編輯器中而不是主窗口中。 – boxofchalk1

+0

@ user3786899,我不是加載一個mfile文件,而是一個所有者文件格式;此外,我的GUI中沒有任何編輯器。 – Romain

回答

1

我試圖實現相同的功能你並試圖獲得轉讓的數據時,落入同樣的例外。

這是相當不明確,如果getTransferable失敗,因爲在%matlabroot%\sys\java\jre\...\lib\flavormap.properties實例(如指向Yair Altman's book 在拖放節)默認FlavorMap或其他一些奇怪的原因。無論如何,我通過file exchange這個dndcontrol對象來處理這個對象,它通過直接在java端管理可傳輸的數據而像我們的目的一樣。

我從中得到啓發,寫上java.awt.dnd.DropTarget是更通用,更貼近其Java實現點對點(即它的工作原理完全相同的方式,不同的是所有的數據類型都被轉換的java DropTarget對象相同的頂我自己的MATLAB代理更標準和方便的matlab類型)。

你可以從這裏下載我的實現:

這裏是做一些使用例如你需要從MATLAB軸(降文件瀏覽器):

% 
% PURPOSE: 
% 
% Show how to add drop support from file explorer to some matlab axis 
% 
% SYNTAX: 
% 
% [] = DropListenerDemo(); 
% 
% USAGE: 
% 
% Simply drop files from file explorer into displayed axis. 
% 

%% 
function [] = DropListenerDemo() 
%[ 
    % Create a figure with some axis inside 
    fig = figure(666); clf; 
    axes('Parent', fig); 

    % Get back the java component associated to the axis 
    % NB1: See §3.7.2 of Undocumented Secrets of Matlab Java Programming 
    % NB2: or use findjobj, or javaObjectEDT for drop support onto other component types 
    jFrame = get(handle(fig), 'JavaFrame'); 
    jAxis = jFrame.getAxisComponent(); 

    % Add listener for drop operations 
    DropListener(jAxis, ... % The component to be observed 
       'DropFcn', @(s, e)onDrop(fig, s, e)); % Function to call on drop operation  
%] 
end 
function [] = onDrop(fig, listener, evtArg) %#ok<INUSL> 
%[ 
    % Get back the dropped data 
    data = evtArg.GetTransferableData(); 

    % Is it transferable as a list of files 
    if (data.IsTransferableAsFileList)  

     % Do whatever you need with this list of files 
     msg = sprintf('%s\n', data.TransferAsFileList{:}); 
     msg = sprintf('Do whatever you need with:\n\n%s', msg); 
     uiwait(msgbox(msg)); 

     % Indicate to the source that drop has completed 
     evtArg.DropComplete(true); 

    elseif (data.IsTransferableAsString) 

     % Not interested 
     evtArg.DropComplete(false); 

    else 

     % Not interested 
     evtArg.DropComplete(false); 

    end 
%] 
end 

該對象還支持捕捉DragEnter,DragOver,DropActionChanged,DragExit事件,以便您可以調整拖動操作的各個方面。只需很少的努力,它也可以擴展爲支持圖像拖動或其他數據類型拖動。

希望你會喜歡它,你會發現它的通用性足以想到其他用法。

-1

有一個帖子在Matlab Central WHI ch使用一個編譯的java類。 A stackoverflow answer包括該代碼。憑藉該解決方案,您的演示可能看起來像這樣:

function demo 
    % Set-up a figure droppable axis 
    hFig = figure('name','DND example','numbertitle','off'); 
    warning('off', 'MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame'); 
    jFrame = get(hFig,'JavaFrame'); 
    jAxis = jFrame.getAxisComponent; 

    % dnccontrol class from above link 
    dndcontrol.initJava(); 
    dndcontrol(jAxis, @dropCallbackFcn); 
end 

function dropCallbackFcn(~, evt) 
    fileparts(evt.Data{1}) % show dropped file's path 
end 
+0

雖然此鏈接可能會回答問題,但最好在此處包含答案的重要部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/15893645) –

+0

不錯的一點,格雷格。剛剛添加了一個包含代碼的stackoverflow鏈接。 –

相關問題