2016-10-21 1 views
0

Как вопрос в заголовке говорит. Я хотел бы, чтобы текстовое поле было возможно выбрать точно так же, как текст в браузере, но не редактируемый.Возможно ли сделать текст в приложении GUID для Matlab, который можно выбрать (и возможно скопировать), но не редактируется?

Я попытался установить свойство «Включить» в выключенное и неактивное. Я также пытался использовать как текстовые поля, так и редактировать тексты и статические текстовые поля. Редактирование текстовых полей с включенным параметром включения позволяет мне выбрать его, но не копировать. Я не знаю, могут ли быть проблемы с ОС (Ubuntu 16.04), поскольку, похоже, Matlab любит использовать другие ключевые клавиши для копирования в Linux. Забавно, когда я нажимаю правой кнопкой мыши на выбираемый текст, ничего не происходит.

Он должен работать в GUIDE, поэтому я предполагаю, что в менеджере свойств, который я пропустил, есть только некоторые настройки.

+0

Для правой кнопкой мыши поведения, вы должны кодировать его самостоятельно (например, добавить [ 'uicontextmenu' ] (https://mathworks.com/help/matlab/ref/uicontextmenu.html) в текстовое поле). Для вашего другого вопроса, если ваша конечная цель состоит в том, чтобы просто скопировать полный текст в буфер обмена, есть хороший трюк, описанный здесь (https://mathworks.com/help/matlab/ref/uicontrol.html#f52- 578590) (в разделе «наконечник»). В противном случае нет простого способа отредактировать/запретить модификацию текста на лету, в Matlab будет срабатывать только событие (позволяющее вам взаимодействовать) после того, как фокус покинет текстовое поле (или нажмите клавишу ввода). – Hoki

+0

Неактивный editbox - это способ пойти imho. Вы можете изменить сочетания клавиш в виде окна в «Настройки >> MATLAB >> Клавиатура >> Ярлыки >> Активные настройки: Windows Default Set' (вероятно, это« Emact Default Set »на данный момент). –

ответ

1

Существует способ достижения этого, но (i) не непосредственно в GUIDE, и (ii) даже в чистом MATLAB. Это решение основано на недокументированных базовых java-свойствах блока MATLAB edit.

Для того, чтобы получить доступ к этим объектам, сначала необходимо скачать утилиту finjobj из обмена файлами.

Вооружившись этим, следующий код отлично работает на MATLAB R2015a, вам, возможно, придется настраивать или использовать скрипты для других версий MATLAB.

Код для demo_editbox_interception.m:

function h = demo_editbox_interception 

% create minimalistic text box 
h.fig = figure('Toolbar','none','Menubar','none') ; 
h.ht = uicontrol('style','edit','Position',[20 20 300 30],... 
    'String','This is a multi-word test string'); 

% find the handle of the underlying java object 
h.jt = findjobj(h.ht) ; 
% disable edition of the java text box 
h.jt.Editable = 0 ; 
% => This leaves you with a text box where you can select all or part of 
% the text present, but you cannot modify the text. 

%% Now add copy functionality: 
% choose which functionality you want from the options below: 
% set(h.ht,'ButtonDownFcn',@copy_full_string) 
set(h.ht,'ButtonDownFcn',{@copy_selection,h.jt}) 


function str = copy_full_string(hobj,~) 
    % this function will copy the ENTIRE content of the edit box into the 
    % clipboard. It does NOT rely on the undocumented java properties 
    str = get(hobj,'String') ; 
    clipboard('copy',str) 
    disp(['String: "' str '" copied into the clipboard.']) 


function str = copy_selection(hobj,evt,jt) 
    % this function will copy the SELECTED content of the edit box into the 
    % clipboard. It DOES rely on the undocumented java properties 
    str = jt.SelectedText ; 
    clipboard('copy',str) 
    disp(['String: "' str '" copied into the clipboard.']) 

Вы можете увидеть его в действие. Выделите текст с левой кнопкой мыши, и огонь обратного вызова (копию) с помощью правой кнопки:

demo gif