Благодаря информации Яира Альтмана в этой статье , у меня есть кое-что для работы, но это связано с взломом базовых объектов Matlab Java (а именно, командного окна).
Он включает в себя присоединение слушателя к командному окну Matlab. Теперь будьте осторожны, часто сохраняйте свою работу и будьте готовы остановить процесс Matlab довольно много раз, пока вы не сделаете это правильно ... потому что каждый раз, когда у вас есть ошибка в коде, вы застреваете в своего рода бесконечном цикле (ошибка/ предупреждение отправляется в командное окно, которое запускает ваш прослушиватель, который повторно запускает ошибку и т. д.). Мне пришлось перезапускать Matlab добрую дюжину раз только для того, чтобы приведенный ниже пример работал стабильно.
Это также причина, по которой я только временно подключаю слушателя. непосредственно перед отправкой команды dos
, и сразу после этого я удаляю прослушиватель. Вы можете оставить слушателя навсегда или настроить его под свои нужды, но помните совет, приведенный чуть выше. Также учтите, что командное окно может содержать огромное количество символов, которые вам могут не понадобиться в вашем текстовом поле, поэтому вам нужно управлять текстом, который вы получаете из него (взять подмножество, как в примере), и подумать, если вы хотите добавить или просто обновить текст в текстовом поле.
Пример ниже кажется стабильным, любые изменения на свой страх и риск ;-)
После запроса в комментарии я добавил 3 функции:
onCleanup
. Это функция Matlab, позволяющая действовать в крайнем случае в случае, если что-то пойдет не так (своего рода механизм «уловить все»). Настоятельно рекомендуется для такого рода программ, использующих недокументированные функции.
myCloseRequestFcn
, которые перехватывают действие закрытия окна, чтобы удалить прослушиватель и избежать циклов ошибок.
Функция scroll_to_bottom
. Это позволяет переместить курсор текстового поля в конец текста (= прокрутить вниз, если текста больше, чем видимого пространства).
Предупреждение. Последняя функциональность может заслуживать отдельного вопроса и снова требовать недокументированной функциональности (поэтому совместимость никогда не гарантируется). Чтобы реализовать его, вам необходимо иметь findjobj
доступна в вашем пути к Matlab. Если вы не хотите загружать внешний компонент, то удалите/закомментируйте часть кода, которая использует его и подфункцию scroll_to_bottom
(и забудьте о прокрутке текстового поля, в чистом Matlab этого сделать нельзя). Или вы можете выбрать предыдущую версию кода, просмотрев историю редактирования сообщения.
function h = gui_MirrorCmdWindow
%% // just to remove the listener in case something goes wrong
closeup = onCleanup(@() cleanup);
%% // create figure and uicontrol
h.f = figure;
h.txtOut = uicontrol(h.f,'Style','edit','Max',30,'Min',0,...
'HorizontalAlignment','left',...
'FontName','FixedWidth',...
'Units','Normalized',...
'Enable','On',...
'Position',[.05 .2 .9 .75]);
h.btnPing = uicontrol(h.f,'Style','Pushbutton',...
'String','Ping',...
'Units','Normalized',...
'Position',[.05 .05 .9 .1],...
'Callback',@btnPing_callback);
guidata(h.f,h)
%// intercept close request function to cleanup before close
set(gcf,'CloseRequestFcn',@myCloseRequestFcn)
%% // Get the handle of the Matlab control window
jDesktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jCmdWin = jDesktop.getClient('Command Window');
jTextArea = jCmdWin.getComponent(0).getViewport.getView;
%% // Get the handle of the jave edit box panel component
jtxtBox = findjobj(h.txtOut) ;
jTxtPane = jtxtBox.getComponent(0).getComponent(0) ;
%// Save these handles
setappdata( h.f , 'jTextArea', jTextArea ) ;
setappdata( h.f , 'jTxtPane', jTxtPane ) ;
function btnPing_callback(hobj,~)
h = guidata(hobj) ;
jTextArea = getappdata( h.f , 'jTextArea' ) ;
my_command = 'ping google.com -n 10' ;
startPos = jTextArea.getCaretPosition ;
set(jTextArea,'CaretUpdateCallback',{@commandWindowMirror,h.f,startPos}) ;
dos( my_command , '-echo' ) ;
pause(1) %// just to make sure we catch the last ECHO before we kill the callback
set(jTextArea,'CaretUpdateCallback',[]) ;
scroll_to_bottom(h.f)
function commandWindowMirror(~,~,hf,startPos)
h = guidata(hf) ;
jTextArea = getappdata( h.f , 'jTextArea' ) ;
%// retrieve the text since the start position
txtLength = jTextArea.getCaretPosition-startPos ;
if txtLength > 0 %// in case a smart bugger pulled a 'clc' between calls
cwText = char(jTextArea.getText(startPos-1,txtLength) ) ;
end
%// display it in the gui textbox
set( h.txtOut, 'String',cwText ) ;
scroll_to_bottom(h.f)
function scroll_to_bottom(hf)
%// place caret at the end of the texbox (=scroll to bottom)
jTxtPane = getappdata( hf , 'jTxtPane' ) ;
jTxtPane.setCaretPosition(jTxtPane.getDocument.getLength)
function myCloseRequestFcn(hobj,~)
cleanup ; %// make sure we remove the listener
delete(hobj) ; %// delete the figure
function cleanup
jDesktop = com.mathworks.mde.desk.MLDesktop.getInstance;
jCmdWin = jDesktop.getClient('Command Window');
jTextArea = jCmdWin.getComponent(0).getViewport.getView;
set(jTextArea,'CaretUpdateCallback',[]) ;
person
Hoki
schedule
09.07.2015