java - Matlab खींचें और ड्रॉप विंडो को विंडो एक्सप्लोरर से आंकड़ा(GUI)




user-interface drag-and-drop (2)

मैं यह जानना चाहूंगा कि एक फ़ाइल को विंडोज एक्सप्लोरर से खींच कर एक रास्ता है और इसे मेरे जीयूआई में छोड़ दें

लक्ष्य फ़ाइल पथ (या फ़ोल्डर पथ) प्राप्त करना चाहिए और इसे अपने स्वयं के लोडिंग फ़ंक्शन से लोड करने में सक्षम होना चाहिए।

मैं सटीक है कि मैं विंडोज 10 64bits में 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)

मैटलब सेंट्रल में एक पोस्ट है जो एक संकलित जावा वर्ग का उपयोग करता है। एक स्टैकहोवरफ्लो उत्तर में कोड शामिल था। उस समाधान के साथ, आपका डेमो इस तरह दिख सकता है:

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

मैंने आपके जैसी ही कार्यक्षमता को लागू करने की कोशिश की और हस्तांतरणीय डेटा प्राप्त करने की कोशिश करते समय एक ही अपवादों में पड़ना

यह स्पष्ट नहीं है कि यदि डिफ़ॉल्ट FlavorMap %matlabroot%\sys\java\jre\...\lib\flavormap.properties (जैसे ड्रैग एंड ड्रॉप अनुभाग में Yair Altman की पुस्तक में इंगित) में instantiated के कारण getTransferable विफल हो जाता है या किसी अन्य अजीब कारण। वैसे भी मैं इस dndcontrol ऑब्जेक्ट पर फ़ाइल एक्सचेंज पर आया जो हमारे उद्देश्य के लिए एक जादू की तरह काम करता है जो सीधे जावा स्टेप पर डेटा के जरिये प्रबंध करता है।

मुझे इस बात से प्रेरणा मिलती है कि मैं java.awt.dnd.DropTarget के शीर्ष पर अपनी खुद की matlab प्रॉक्सी लिखा है जो अधिक सामान्य और उसके जावा क्रियान्वयन के लिए करीब है (यानी यह बिल्कुल उसी तरह से काम करता है जितना कि जावा DropTarget ऑब्जेक्ट को छोड़कर सभी डेटा प्रकार अधिक मानक और सुविधाजनक 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 इवेंट को पकड़ने के लिए भी समर्थन करता है ताकि आप ऑपरेशन को खींचने के हर पहलू को ट्यून कर सकें। बहुत कम प्रयास के साथ, इसे छवि खींचने या अन्य डेटा प्रकारों को खींचने के लिए समर्थन के लिए भी बढ़ाया जा सकता है।

आशा है कि आपको यह पसंद आएगा और आप इसे अन्य तरीकों के बारे में सोचने के लिए पर्याप्त सामान्य पाएंगे।





matlab-figure