matlab - कैसे यूटिटी में कोशिकाओं को अचयनित करें/सेल चयन हाइलाइटिंग अक्षम करने के लिए?




user-interface callback (2)

कुछ गहन शोध के बाद मुझे पता चला कि Matlab समर्थन निम्न समाधान के साथ आता है:

%overwrite data with a dummy and restore the old data afterwards, to force deselection
function modifySelection(src,~)
 ...
temp = get(src,'Data')
set(src,'Data',{ 'dummy' });
set(src,'Data', temp );

end

ऐसा करने से नीली हाइलाइटिंग खत्म हो गई है, लेकिन आखिरी चयनित कक्ष के आसपास बिंदीदार रेखा बनी हुई है! लेकिन मुझे यह हल करने का एक समाधान मिला, जो पहले भाग को अपनाने योग्य बनाता है

function modifySelection(src,evt)
 ...
fh = get(src,'parent');    % get parent figure handle
copyobj(src,fh);           % copy uitable to parent figure
delete(src);               % delete current uitable

end

वांछित व्यवहार में कौन सी परिणाम:

दूसरे समाधान का दोष: एक नई ऑब्जेक्ट के निर्माण की वजह से, यह थोड़ी (शायद धीमी मशीनों पर बस) कम हो जाती है।

मैंने निम्न उपयुक्त बनाया:

वास्तव में हर पंक्ति एक अप्रतिष्ठित योग्य है, इसलिए दिखाए गए आंकड़े में शीर्षलेख के अलावा 5 युटिलबिल शामिल हैं। मैं ऐसा क्यों कर रहा हूं, मेरे आखिरी प्रश्न का मुद्दा था, जिसके परिणामस्वरूप दिखाया गया तालिका। पूरी तरह से निष्पादन योग्य कोड आपको उत्तर में मिल सकता है (या नीचे एक न्यूनतम उदाहरण) एक सामान्य जीयूआई का इस्तेमाल कर रहे समाधान भी वहां होते हैं, लेकिन यह कोड को बहुत अधिक उड़ा देगा, और वास्तव में यह सिर्फ एक प्रकार की बग है।

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

यूटैबल्स के लिए 'SelectionHighlight' हाइलाइट 'SelectionHighlight' संपत्ति है, जो किसी समाधान की तरह लगता है, लेकिन यह कुछ भी बदल नहीं रहा है। मैंने इसे निम्नलिखित के रूप में प्रयोग किया था:

set(src,'SelectionHighlight','off')  %where src is the handle of the current uitable

विभिन्न स्थानों पर: 'CellSelectionCallback' के अंत में, 'CellSelectionCallback' के अंत में और वैश्विक संपत्ति के रूप में। लेकिन हर बार आखिरी सेल चयनित रहता है असल में मुझे चयन की बिल्कुल आवश्यकता नहीं है।

मैं अपने सारे uitables के लिए पूरे चयन या चयन हाइलाइटिंग संपत्ति कैसे अक्षम कर सकता हूँ?

मुझे इस संपत्ति का उपयोग कैसे करना है, इसका एक प्रभाव है?

वैकल्पिक रूप से: मैं "हाइलाइटिंग" रंग (और इसलिए टेक्स्ट-रंग) को कैसे बदल सकता हूं, ताकि हाइलाइटिंग अब सिर्फ दृश्यमान न हो?

जाहिर तौर पर यह समस्या अन्य संदर्भों में भी दिखाई देती है

मैंने एक न्यूनतम निष्पादन योग्य उदाहरण बनाया है, जहां कोई एक पंक्ति को 1 और 3 के बीच प्रत्येक पंक्ति में चुन सकता है।

function minimalTable 

%basic properties
line_height = 21.32;
table_height = 3*line_height;
lh = line_height/table_height;

h = figure('Position',[200 100 202 table_height],'numbertitle','off','MenuBar','none');

% addrow(figurehandle,number of row, percentage lineheight)
% every function call creates a new row, later dynamically
addRow(h,1,lh);
addRow(h,2,lh);
addRow(h,3,lh);
end

function modifySelection(src,~)
set(src,'SelectionHighlight','off')
waitfor(src)
end

function [th] = addRow(fh,k,lhp)
selector = { '1'; '2' ; '3' };
defaultData  =  {'select number...'};
columnformat =  {  {selector{:}}   };
columneditable =  true;

th = uitable(fh,'Units','normalized','Position',[0 1-k*lhp 1 lhp],...
              'Data', defaultData,... 
              'ColumnName', [],...
              'ColumnWidth', {200},...
              'ColumnEditable', columneditable,...
              'ColumnFormat', columnformat,...  
              'RowName',[],...
              'SelectionHighlight','off',...
              'CellEditCallback',@modifySelection);
end

का परिणाम:


ठीक है, मुझे कोशिकाओं को अचयनित करने के लिए एक समाधान मिला:

सबसे पहले, यह कुछ जावा की आवश्यकता है लेकिन चिंता न करें, यह अभी भी Matlab की तरह दिखेगा :)

1. आप स्क्रिप्ट findjobj की आवश्यकता होगी Yair Altman द्वारा: TMW फ़ाइल एक्सचेंज: findjobj

2. आपको अपनी मेज के संभाल की ज़रूरत है, इसे मेटेबल कहते हैं। फिर आपको अंतर्निहित जावा-तालिका की आवश्यकता है और सही वस्तुएं प्राप्त करने के लिए कुछ चीज़ें करें और कुछ गुण सेट करें। आप यह कर सकते हैं:

jscroll=findjobj(mtable);
h=jscroll.getComponents;
viewport=h(1);
a=viewport.getComponents;
jtable=a(1); %com.mathworks.hg.peer.ui.UITablePeer
jtable.setRowSelectionAllowed(0);
jtable.setColumnSelectionAllowed(0);

3. अब और अधिक मुश्किल भाग (कम से कम मेरे लिए यह था): यदि आपके पास सेल सेलेक्शन के लिए कुछ कॉलबैक है, लेकिन आप इसे अभी नहीं छोड़ना चाहते हैं, तो आपको इसे अस्थायी रूप से बंद करना होगा:

set(mtable, 'CellSelectionCallback', []);

अब आप इस चयन को बदल सकते हैं:

jtable.changeSelection(row-1,col-1, false, false);
%Java-> zero ^= one <-Matlab

और अब, मैं उम्मीद कर रहा था, जब CellSelectionCallback अपने मूल समारोह में वापस सेट, सब कुछ ठीक होगा। नहीं, यह कॉलबैक से आगे निकल रहा था। मुझे अभी भी सही कारण नहीं पता है, लेकिन यह मुझे लगता है, कि jtable कॉलिंग। चयन () चयन में परिवर्तन होता है और फिर निर्दिष्ट कॉलबैक बुला रहा है, लेकिन कॉलर फ़ंक्शन प्रतीक्षा नहीं कर रहा है, जबकि यह प्रक्रिया चल रही है। तो मैंने जो कोशिश की (और मुझे नहीं पता कि यह ऐसा करने का सबसे अच्छा तरीका है, लेकिन यह बहुत अच्छी तरह से काम कर रहा है) सिर्फ एक सेकंड के लिए विराम देना है और फिर कॉलबैक को वापस सेट करना है:

pause(1)
set(mtable, 'CellSelectionCallback', @myOriginalFunction);

4. अब सिर्फ एक और बात है: मेरा उद्देश्य केवल किसी अन्य सेल में चयन को बदलना था। आपका चयन रद्द करना है मैं जावा घटकों के बारे में कुछ नहीं जानता, लेकिन मैं सिर्फ पंक्ति / स्तंभ पैरामीटर को -1 में सेट करके सफल हुआ:

jtable.changeSelection(-1,-1, false, false);

आखिरकार मैंने कई समस्याओं का उपयोग करके undocumentedmatlab.com और अन्य पदों पर समझाया इस समस्या को हल किया। मुझे यकीन नहीं है कि सभी लाइनों को कॉल करने के लिए आवश्यक हैं। ध्यान दें, यह केवल दस्तावेज के लिए उपलब्ध होगा Matlab-uitable जो पहले संस्करण 2008 ( या बी , मुझे इस बारे में निश्चित नहीं है) में दिखाई देता है।

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

बस एक छोटा "गतिशील" न्यूनतम उदाहरण (एक बदलाव देखने के लिए 3 सेकंड प्रतीक्षा करें ;-)):

function startUitable()
xDat=ones(5,3);
h=figure('Tag','TestFigure');
mtable=uitable('Tag','TestUITABLE');
rowField=uicontrol('units','normalized','Style','edit','Position',[0.4 0.9 0.1 0.1],'parent',h,'Tag','rowField');
colField=uicontrol('units','normalized','Style','edit','Position',[0.6 0.9 0.1 0.1],'parent',h,'Tag','colField');
set(mtable, 'Units','normalized','Position',...
[0.01 0.01 0.8 0.8], 'Data', xDat,...
'ColumnEditable', [false, false,false],...
'ColumnWidth', 'auto')
myButton=uicontrol('units','normalized','Style','pushbutton','parent',h,'Position',[0.04 0.9 0.3 0.1],'String','change Selection')
set(myButton,'Callback',@changeSelection)
end

function  changeSelection(~,~,~)

mtable=findobj('Tag','TestUITABLE');
jscroll=findjobj(mtable);
h=jscroll.getComponents;
viewport=h(1);
a=viewport.getComponents;
jtable=a(1); %com.mathworks.hg.peer.ui.UITablePeer
%     jtable.setRowSelectionAllowed(0);
%     jtable.setColumnSelectionAllowed(0);
row=str2num(get(findobj('Tag','rowField'),'String'));
col=str2num(get(findobj('Tag','colField'),'String'));
jtable.changeSelection(row-1,col-1, false, false);
end